2 java小程序

合集下载

APPLET程序

APPLET程序

图 2.2 Java Applet的下载执行过程
从这个过程中可以看出,Java Applet的字节码程序最早 是保存在 Web 服务器上的,而它的运行过程则是在下载到 本地后在本地机上完成的,这实际上就是网络应用程序的 发布过程。 当 Applet 程序需要修改或维护时只要改动服务器一处的 程序即可。 当然,这样做的前提条件是Applet的字节码程序可以在网 络上的任何一台机器上顺利地运行,而这种跨平台的要求, 根据前面的介绍,已由Java的解释器机制加以保证和实现 。
当浏览器执行 Applet 程序时,会自动产生两个实例(两个对 象),一个是系统类 Applet 的子类的实例,另一个是系统类 Graphics的实例。前者调用Applet的子类的实例中paint方法, 后者作为实际参数赋值给paint方法中的形式参数g。
g 是系统类 Graphics 的一个对象,它代表了 Web 页面上 Applet程序的界面区域的背景,调用g的方法来显示字符串, 就是在当前Applet程序的界面区域的背景上显示字符串。 虽然Java Application和Java Applet在运行方式上有很大 的不同,但是它们遵循相同的 Java 语言的语法规则,所以 编译时也使用完全相同的编译工具。 例如: javac MyJavaApplet.java 编译的结果在当前目录下将生成一个以源代码中的类名 MyJavaApplet命名的字节码文件MyJavaApplet.class。
(4)当用户编写的 Applet程序编译通过后,就可以使WWW 浏览器在解释执行 HTML文件时,调用该 Applet 程序。通过 自动执行用户改写过的成员方法,例如paint方法,来实现用 户程序预期的功能。
系 统 类 Applet 中 已 经 定 义 好 的 成 员 方 法 还 有 , init();start();stop();destroy(); 它们与 paint 方法使用的方式类 似。 paint 方法与其他的一些 Applet 中的方法一样,能够被 WWW浏览器识别和在恰当的时刻自动调用。

Java做的一个小程序-随机点名器

Java做的一个小程序-随机点名器

Java做的一个小程序-随机点名器介绍随机点名器是一款使用Java编写的小程序,它主要用于在学生课堂上随机抽取学生姓名进行点名。

该程序可以通过命令行方式运行,而且它的使用非常简单,不需要任何的专业技能与知识。

功能特点随机点名器的主要功能是在学生课堂上进行学生姓名的随机抽取,以帮助老师完成课堂管理工作。

程序的具体功能特点如下:•支持添加学生姓名:程序可以通过用户输入学生姓名的方式,将其添加到学生库中。

•支持删除学生姓名:用户可以对已存在的学生进行删除操作。

•支持随机点名:程序可以随机抽取学生姓名,以完成点名的操作。

•支持列表显示:程序可以展示所有的学生姓名列表,以供用户查看。

使用说明系统要求随机点名器使用Java语言编写,因此用户需要先安装Java运行环境。

具体要求如下:•操作系统:Windows、Linux、MacOS等•Java版本:JRE 1.8或以上版本安装方法1.下载程序压缩包。

2.解压缩到用户指定的目录。

3.运行“run.bat”文件(Windows平台)或“run.sh”文件(Linux/MacOS平台)。

使用方法1.添加学生姓名:在命令行窗口中输入“add”命令,然后输入学生姓名进行添加。

2.删除学生姓名:在命令行窗口中输入“delete”命令,然后输入需要删除的学生姓名。

3.随机点名:在命令行窗口中输入“random”命令,程序将随机抽取一个学生姓名进行点名。

4.显示学生列表:在命令行窗口中输入“list”命令,程序将展示所有已经添加的学生姓名。

技术实现技术框架随机点名器采用Java语言编写,主要使用了JDK中的标准库,使用了Collection接口中的List、Set集合类、Random类等。

算法实现随机点名的算法实现主要通过Java中的Random类实现,随机整数范围为0到学生数量-1,通过集合类的索引访问随机抽取的学生姓名。

代码实现```Java import java.util.*;public class RandomPicker { private List students;public RandomPicker() {students = new ArrayList<String>();}public void add(String name) {students.add(name);}public void delete(String name) {students.remove(name);}public String random() {Random random = new Random();int index = random.nextInt(students.size());return students.get(index);}public void list() {int n = 1;for(String student : students) {System.out.println((n++) + \。

java开发小程序登录功能

java开发小程序登录功能

java开发⼩程序登录功能整体流程如下:- 1.获取code- 2.⽤步骤1获取到的临时code换取⽤户唯⼀标识OpenId和会话密钥 session_key- 3.获取⽤户⼿机号,进⾏登录请求参数:请求参数:属性类型默认值必填说明appid string是⼩程序 appIdsecret string是⼩程序 appSecretjs_code string是登录时获取的 codegrant_type string是授权类型,此处只需填写 authorization_code 返回值:属性类型说明openid string⽤户唯⼀标识session_key string会话密钥unionid string⽤户在开放平台的唯⼀标识符,在满⾜ UnionID 下发条件的情况下会返回,详见。

errcode number错误码errmsg string错误信息开发前准备(必须)appid:wx4c1d53****7a671appsecret:fc9f99c08dcb2a0****eb26376c65eae⼩程序代码:login.js// pages/login/login.wxml.jsconst app = getApp();Page({/*** 页⾯的初始数据*/data: {// 判断⼩程序的API,回调,参数,组件等是否在当前版本可⽤。

canIUse: wx.canIUse('button.open-type.getPhoneNumber'),wechat: '微信快捷登录',isShow: false},/*** ⽣命周期函数--监听页⾯加载*/onLoad: function (options) {// 从缓存中取⼿机号console.log("获取⼿机号!")try {var value = wx.getStorageSync('phoneNumber')if (value) { // 说明已登录跳转页⾯console.log("获取缓存:"+value)wx.navigateTo({url: '../login?param=' + value})}else{// 未登录显⽰微信授权页⾯this.setData({isShow: true})}} catch (e) {}// 解决第⼀次获取⼿机号失败问题wx.login({success: res => {if(res.code){console.log("code->", res.code)}}})},// 0.获取⼿机号授权getPhoneNumber: function(e) {// ⽤户拒绝授权if(e.detail.errMsg == "getPhoneNumber:fail user deny") {wx.showToast({icon: "none",title: '请允许获取⼿机号,否则功能不可⽤!',})return}// console.log("e->detail", e.detail)/// ⽤户允许授权// console.log("iv->", e.detail.iv); //包括敏感数据在内的完整⽤户信息的加密数据,需要解密// console.log("encryptedData->", e.detail.encryptedData); //加密算法的初始向量,解密需要⽤到/// 获取⼿机号// 1.获取临时登录凭证codewx.login({success: res => {if(res.code){this.code = res.code;console.log("code->", res.code)console.log("encryptedData->", encodeURIComponent(e.detail.encryptedData))console.log("iv->", e.detail.iv)this.getSessionKey(res.code, e.detail.encryptedData, e.detail.iv);}}})},// 2.访问登录凭证校验接⼝获取session_key(后续改成后台实现)getSessionKey: function(js_code, encryptedData, iv) {// 3. 解密获取⼿机号wx.request({url: 'http://localhost:8082/wechat/appletLogin',data: {'encryptedData': encodeURIComponent(encryptedData),//需要进⾏编码'iv': iv,'jscode': js_code},method: 'POST',header: {'content-type': 'application/json'}, // 设置请求的 headersuccess: function(data2) {console.log(data)if(data.resultCode == 200) {if(er.phone==undefined){// 获取⼿机号失败跳转到常规⽤户登录页⾯(通过webview)wx.navigateTo({url: '⽤户登录页'})return}// 存储数据到缓存wx.setStorage({key:"phoneNumber",data:er.phone})// 4.跳转页⾯}},fail: function(err) {console.log(err);wx.showToast({icon: "none",title: '获取⼿机号失败,请重试!',})}})},/*** ⽣命周期函数--监听页⾯初次渲染完成*/onReady: function () {},/*** ⽣命周期函数--监听页⾯显⽰*/onShow: function () {},/*** ⽣命周期函数--监听页⾯隐藏*/onHide: function () {},/*** ⽣命周期函数--监听页⾯卸载*/onUnload: function () {},/*** 页⾯相关事件处理函数--监听⽤户下拉动作*/onPullDownRefresh: function () {},/*** 页⾯上拉触底事件的处理函数*/onReachBottom: function () {},/*** ⽤户点击右上⾓分享*/onShareAppMessage: function () {}})login.json{"usingComponents": {}}login.wxml<!--pages/login.wxml--><view class="modal-mask" catchtouchmove="preventTouchMove" wx:if="{{isShow}}"></view> <view class="modal-dialog" wx:if="{{isShow}}"><view class="modal-content"><view><image src='../images/show.png' class='show'></image></view><!-- <view>绑定⼿机号</view><view>请先绑定⼿机号在进⾏此操作</view> --><button class="show" type="primary" lang="zh_CN"open-type='getPhoneNumber' bindgetphonenumber="getPhoneNumber" >微信⽤户⼀键登录</button></view></view>login.wxss/* pages/login/login.wxml.wxss */.show{display: block;border-radius: 8rpx;margin: 20rpx 20rpx 20rpx 20rpx;font-size: 35rpx;}.container{position: fixed; /*关键属性,设置为fixed*/display: flex;flex-direction: column;width: 100%;height: 100%;}后端代码WxLoginController.java@RestController@RequestMapping("/wechat")public class WxLoginController {private Logger logger = LoggerFactory.getLogger(WxLoginController.class);@AutowiredUserDao userDao;@Value("${wechat.appid}")private String appid;@Value("${wechat.appsecret}")private String appsecret;private Map<String, Object> userMap = new HashMap<>();public ResultBean appletLogin(String encryptedData, String iv, String jscode) {System.out.println(encryptedData);ResultBean resultBean = new ResultBean();// jscodeif (StringUtils.isEmpty(jscode)) {resultBean.setResultCode(-10001);resultBean.setResultMessage("鉴权失败!");return resultBean;}// signif (StringUtils.isEmpty(encryptedData)) {resultBean.setResultCode(-10001);resultBean.setResultMessage("鉴权失败!");return resultBean;}if(StringUtils.isBlank(iv)) {resultBean.setResultCode(-10002);resultBean.setResultMessage("鉴权失败!");return resultBean;}// 创建Httpclient对象CloseableHttpClient httpclient = HttpClients.createDefault();String resultString = "";CloseableHttpResponse response = null;String url =WxContants.url.replace(WxContants.APPID, appid).replace(WxContants.SECRET, appsecret).replace(WxContants.JSCODE, jscode);try {// 创建uriURIBuilder builder = new URIBuilder(url);URI uri = builder.build();// 创建http GET请求HttpGet httpGet = new HttpGet(uri);// 执⾏请求response = httpclient.execute(httpGet);// 判断返回状态是否为200if (response.getStatusLine().getStatusCode() == 200) {resultString = EntityUtils.toString(response.getEntity(), "UTF-8");}} catch (Exception e) {e.printStackTrace();}// 解析jsonJSONObject jsonObject = (JSONObject) JSONObject.parse(resultString);String session_key = jsonObject.getString("session_key");String openid = jsonObject.getString("openid");System.out.println("session_key:"+session_key + ",openid:"+openid);if (StringUtils.isEmpty(session_key)) {resultBean.setResultCode(-10003);resultBean.setResultMessage("获取sessionkey失败!");return resultBean;}// 解码try {encryptedData = URLDecoder.decode(encryptedData,"UTF-8");} catch (UnsupportedEncodingException e) {logger.error("encryptedData,decode失败!", e);resultBean.setResultCode(-10003);resultBean.setResultMessage("encryptedData,decode失败!");return resultBean;}String decryptData = WechatDecryptDataUtil.decryptData(encryptedData, session_key, iv); JSONObject userInfo = JSONObject.parseObject(decryptData);// 存⼊redis+数据库,判断是否存在redis中,存在直接从redis返回// 本地使⽤Map模拟if (!userMap.containsKey(openid)) {// 判断⽤户是否存在系统中String phoneNumber = userInfo.getString("phoneNumber");User user = userDao.findByPhone(phoneNumber);if (user == null) {resultBean.setResultCode(200);resultBean.setResultMessage("此⽤户不存在,请先注册!");return resultBean;}user.setOpenId(openid);userDao.save(user);userMap.put(openid, user);}User user = (User) userMap.get(openid);resultBean.setResultCode(200);resultBean.setResultMessage("成功!");resultBean.setData(user);return resultBean;}}UserDao.javapublic interface UserDao extends JpaRepository<User, Long> {User findByPhone(String phone);User findByOpenId(String openId);}User.java@Entity@Table(name = "user")public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String openId;private String phone;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getOpenId() {return openId;}public void setOpenId(String openId) {this.openId = openId;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}}WechatDecryptDataUtil.javapublic class WechatDecryptDataUtil {private static Logger logger = LogManager.getLogger(WechatDecryptDataUtil.class);public static void main(String[] args) {String result = decryptData("BLY05rL1qLzGdqn+m4s4KfnM9CbMCm2sTZmgIcUJUpoOVeZkKKYh06ATVm2BgX8HUsH1a93811fhwr70MTh2Pk2qw9rPBzvos3husUJdVfaZgBk3Afp6wNFS0/kcoyt+7q2eMrIHMe6wkc4J0hgbbkxdUwZag/pyKXwe4pUzSQfta7dfBHy3DLu+REvwHiDNf "C9Z59YjFkCDT8+9NQ3OxcA==","oOWTpbZ80evG/GQqRdUu3w==");System.out.println("result = " + result);}public synchronized static String decryptData(String encryptDataB64, String sessionKeyB64, String ivB64) {String res = null;try {res = new String(decryptOfDiyIV(Base64.decode(encryptDataB64),Base64.decode(sessionKeyB64),Base64.decode(ivB64)));} catch (Exception e) {logger.error("encryptDataB64:"+encryptDataB64+"\n"+"sessionKeyB64:"+sessionKeyB64+"\n"+"ivB64:"+ivB64);}return res;}private static final String KEY_ALGORITHM = "AES";private static final String ALGORITHM_STR = "AES/CBC/PKCS7Padding";private static Key key;private static Cipher cipher;private static void init(byte[] keyBytes) {// 如果密钥不⾜16位,那么就补⾜. 这个if 中的内容很重要int base = 16;if (keyBytes.length % base != 0) {int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);byte[] temp = new byte[groups * base];Arrays.fill(temp, (byte) 0);System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);keyBytes = temp;}// 初始化Security.addProvider(new BouncyCastleProvider());// 转化成JAVA的密钥格式key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);try {// 初始化ciphercipher = Cipher.getInstance(ALGORITHM_STR, "BC");} catch (Exception e) {e.printStackTrace();}}/*** 解密⽅法** @param encryptedData 要解密的字符串* @param keyBytes 解密密钥* @param ivs ⾃定义对称解密算法初始向量 iv* @return 解密后的字节数组*/private static byte[] decryptOfDiyIV(byte[] encryptedData, byte[] keyBytes, byte[] ivs) {byte[] encryptedText = null;init(keyBytes);try {cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(ivs));encryptedText = cipher.doFinal(encryptedData);} catch (Exception e) {e.printStackTrace();}return encryptedText;}}WxContants.javapublic interface WxContants {String APPID = "APPID";String SECRET = "SECRET";String JSCODE = "JSCODE";String TRADE_TYPE = "JSAPI";String url = "https:///sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code";}。

推金币Java小程序(Java)

推金币Java小程序(Java)

推金币Java小程序(Java)推金币游戏是一种常见的娱乐方式,通过这个小程序,我们可以学习如何使用Java语言来实现一个简单的推金币游戏。

本文将介绍推金币游戏的规则以及Java代码的实现。

一、游戏规则推金币游戏是一个单人游戏,游戏中有一堆金币,玩家的目标是通过不断推动金币使其从堆中掉落。

游戏的规则如下:1. 开始时,堆中有一定数量的金币。

2. 玩家每次可以选择推动金币的个数,推动的个数范围是1到3个金币。

3. 玩家和电脑交替进行推金币的操作,直到堆中的金币被推空。

4. 最后将判断推完金币时,是玩家推金币的次数奇数还是偶数,奇数次则玩家获胜,偶数次则电脑获胜。

二、Java代码实现下面是使用Java语言实现推金币小程序的代码:```javaimport java.util.Scanner;public class PushCoinGame {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int coins = 10; // 初始金币数量int count = 0; // 推金币次数while (coins > 0) {// 玩家推金币System.out.print("请输入你要推的金币个数(1-3个):"); int num = scanner.nextInt();if (num < 1 || num > 3 || num > coins) {System.out.println("输入不合法,请重新输入!");continue;}coins -= num;count++;// 判断堆中金币是否已经被推空if (coins <= 0) {break;}// 电脑推金币int compNum = 4 - num; // 电脑总是推剩余金币个数和为4的倍数的数量coins -= compNum;count++;}// 判断胜负if (count % 2 == 0) {System.out.println("电脑获胜!");} else {System.out.println("玩家获胜!");}}}```三、小结通过以上代码,我们实现了一个简单的推金币游戏的Java小程序。

java日历小程序

java日历小程序

java日历小程序简介:Java日历小程序是一个基于Java语言开发的工具,用于显示和管理日期和时间。

它提供了一种简单而直观的方式来查看、创建和编辑日历事件,并提供了一些额外的功能,如提醒、重复事件和时间段的计算等。

本文将详细介绍Java日历小程序的功能、使用方法和设计原理。

功能:1. 显示日历:Java日历小程序可以显示当前月份的日历,并以日、周或月的形式展示。

用户可以通过界面上的上下翻页按钮切换月份,方便查看不同日期的日历。

2. 创建和编辑事件:用户可以通过Java日历小程序创建新的日历事件,并为每个事件指定标题、日期、时间和地点等详细信息。

程序还提供了事件编辑功能,允许用户修改已有事件的信息。

3. 提醒功能:Java日历小程序可以设置事件的提醒功能,提醒用户在指定的时间前提醒。

用户可以选择在事件开始前几分钟、几小时或几天提醒,并可以自定义提醒方式,如弹窗、声音或邮件通知等。

4. 重复事件:用户可以为事件设置重复功能,使事件在指定的日期间隔内重复发生。

可以选择每天、每周、每月或每年重复,并可以设置重复的结束日期。

5. 时间段计算:Java日历小程序可以计算两个日期之间的时间段,如计算两个事件之间的天数、小时数或分钟数等。

用户可以选择计算方式,并获取精确的时间段结果。

使用方法:1. 下载和安装:用户可以从官方网站上下载Java日历小程序的安装包,然后按照安装向导进行安装。

安装完成后,用户可以在桌面或开始菜单中找到程序的快捷方式。

2. 打开程序:双击程序的快捷方式,Java日历小程序将启动并显示当前月份的日历。

用户可以通过界面上的按钮和菜单来使用各种功能。

3. 创建事件:用户可以点击界面上的“添加事件”按钮,弹出一个对话框,输入事件的详细信息,如标题、日期、时间和地点等。

点击“确定”按钮后,事件将被创建并显示在日历上。

4. 编辑事件:用户可以在日历上点击已有的事件,弹出一个对话框,允许用户修改事件的信息。

java课程设计贪吃蛇小程序 附代码(2)

java课程设计贪吃蛇小程序 附代码(2)
}
public void keyPressed(KeyEvent e) {//按键响应
int keyCode=e.getKeyCode();
if(stat==1) switch(keyCode){
case KeyEvent.VK_UP:if(direction!=SOUTH) direction=NORTH;break;
游戏主界面模块:
游戏的主界面是进入游戏后,能够给玩家第一感官的部分,主要包括游戏图形区域界面、游戏的速度选择更新界面、新生方块的预览、游戏速度控制按钮、暂停游戏按钮、重新开始游戏按钮以及游戏排行榜按钮。从很大程度上决定了玩家对游戏的兴趣问题,因此,游戏的主界面应该力求美观,爽心悦目。
游戏控制模块:
这个模块是游戏的中心环节,主要完成控制游戏的速度、暂停、重新开始等功能。为了能够给玩家一个很好的游戏环境,这部分应该做到易懂、易操作。
本设计所开发的是基于Java的一个贪吃蛇游戏软件,主要实现游戏的速度控制、游戏的暂停、游戏的退出等功能,分为: 游戏主界面模块、游戏控制模块以二个模块。
性能:
本软件在设计方面本着方便、实用及娱乐性高的宗旨,在对界面进行设计的过程中,始终坚持清晰明了,在性能方面能够实现效率高,不易出错等优点。
自定义类说明
图3-1程序运行图
当蛇没有吃到食物且碰到边界或碰撞到自己的身体时,游戏结束,此时得分为0。如果想重新开始即按ENTER或S键,运行结果如图3-2所示:
图3-2程序结束图
程序异常处理
在蛇的运行线程过程中,当蛇撞到墙或自己的身体时,将抛出一个Exception类的异常对象,然后使用try-catch去捕捉这个异常,
2、课程设计的具体要求:
(1)界面美观大方,操作简单便捷,按键布局美观。

猜成语Java小程序(Java)

猜成语Java小程序(Java)

猜成语Java小程序(Java)一、引言成语是中华文化的瑰宝,它们凝练、精辟地表达了智慧和人生哲理。

为了增进对成语的理解和记忆,并加深对Java编程语言的应用,我们设计了一个猜成语的小程序。

这个小程序运用Java编程语言实现,具有交互性和趣味性,可以提供一种有趣的学习方法和娱乐方式。

二、程序设计方案1. 界面设计为了使程序界面美观整洁,我们使用Java的图形用户界面库(Swing)进行设计。

在程序的主界面上,我们引入一幅适应窗口大小的背景图片,使整个界面富有元素,增加用户体验感。

2. 成语数据集为了实现成语的随机猜测,我们需要一个成语数据集。

我们选择了一个包含多个常用成语的文本文件(idioms.txt)作为数据源。

程序在启动时从该文件中读取成语,并将其存储在一个ArrayList对象中。

3. 游戏逻辑实现程序首先从成语数据集中随机选择一个成语作为答案,并将其打乱顺序显示在界面上。

用户需要通过输入成语的正确顺序来猜测答案。

程序提供一个文本框供用户输入,用户每输入一个成语后,程序会给出反馈,告知用户该成语是否正确。

4. 成功判断和反馈当用户输入的成语顺序与答案一致时,程序将判断猜测正确,弹出一个提示框,告知用户回答正确。

同时,程序还会显示出答案的含义和出处,增强用户对成语的理解。

若用户输入的成语顺序与答案不一致,则程序会给出相应的错误提示,提示用户继续猜测,直到猜测正确为止。

三、程序运行展示(这里可以插入几张程序运行截图,展示整个程序的界面和交互过程)四、程序实现过程1. 导入所需库为了使程序实现图形用户界面,我们需要导入Java的Swing库。

在程序开始的地方,添加以下导入语句:```import javax.swing.*;```2. 程序主类创建一个主类,继承JFrame类,并在主类中实现界面的布局和事件监听器的设置。

```public class GuessIdiom extends JFrame{// 界面布局和事件监听器设置的代码// ...}```3. 界面设计在主类中添加一个方法,用于设置界面的布局和组件。

Java后端微信小程序支付demo(网上说的坑里面基本上都有)

Java后端微信小程序支付demo(网上说的坑里面基本上都有)

Java后端微信⼩程序⽀付demo(⽹上说的坑⾥⾯基本上都有)Java 后端微信⼩程序⽀付⼀、遇到的问题1. 商户号该产品权限未开通,请前往商户平台>产品中⼼检查后重试2.签名错误3.已经调起微信统⼀下单接⼝,可以拿到预⽀付ID,但是前端⽀付的时候出现⽀付验证签名失败⽹上的问题基本上就是这三类下⾯说解决⽅案。

第⼀个问题:商户号的问题,微信app⽀付与微信⼩程序⽀付的商户号不同,微信app内⽀付与微信开放平台内的商户号绑定,微信⼩程序⽀付是与微信公众平台内的商户号绑定。

第⼆个问题:签名错误,第⼀次签名需要的appid mchid key 分别对应的是⼩程序的appid、微信公众平台绑定的商户号、以及商户平台的密钥(重要的事情说三遍:商户平台的!商户平台的!商户平台的!)。

这⾥重点说下商户平台的密钥(当时就是因为密钥的问题耽误了不少时间):具体请看图(商户平台--->账户中⼼--->API安全---->设置密钥)第三个问题:⽀付验证签名失败这个就得需要严格执⾏⼩程序⽀付⽂档中的⽣成签名的规则。

参数字段⼤⼩写、顺序⼀定要对(切记,切记,切记)如果能把以上都注意到了,那基本上没什么问题了。

下⾯是我⾃⼰写的demo供⼤家参考,有什么问题可以留⾔。

⼆、demo 事例1.下载商户的证书(在问题2的截图中已经展⽰下载的位置)放在resources下的cert⽬录下(cert⽬录需要⾃⼰⼿动建)2.实现微信的 WXPayConfig接⼝1package mon;23import com.github.wxpay.sdk.WXPayConfig;4import mons.io.IOUtils;56import java.io.ByteArrayInputStream;7import java.io.InputStream;89public class MiniprogramConfig implements WXPayConfig{1011private byte[] certData;1213public MiniprogramConfig() throws Exception {14 InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("cert/miniProgram/apiclient_cert.p12"); 15this.certData = IOUtils.toByteArray(certStream);16 certStream.close();17 }1819 @Override20public String getAppID() {21return "wx6db448a73f8a6666";22 } //⼩程序appid2324 @Override25public String getMchID() {26return "1500669999";27 } //商户号2829/** 商户平台-账户中⼼-API安全中的密钥 */30 @Override31public String getKey() {32return "1add1a30ac87aa77yyy2db72f57a237577777";33 }3435 @Override36public InputStream getCertStream() {37return new ByteArrayInputStream(this.certData);38 }3940 @Override41public int getHttpConnectTimeoutMs() {42return 0;43 }4445 @Override46public int getHttpReadTimeoutMs() {47return 0;48 }49 }3.调⽤微信统⼀下单接⼝并且实现签名1private Map<String, String> createMiniProgramTradePay(WxpayTradeAppPayModel model,String notifyUrl) throws Exception {2 MiniprogramConfig config = new MiniprogramConfig();34 WXPay wxpay = new WXPay(config);56 Map<String, String> data = new HashMap<>();7 data.put("appid",config.getAppID());8 data.put("mch_id",config.getMchID());9 data.put("body",model.getBody());10 data.put("out_trade_no", model.getOutTradeNo());11 data.put("device_info", "");12 data.put("fee_type", "CNY");13 data.put("total_fee", model.getTotalFee());14 data.put("spbill_create_ip", "127.0.0.1");15 data.put("notify_url", notifyUrl);16 data.put("trade_type", "JSAPI");17 data.put("openid",model.getOpenId());18// data.put("nonce_str","1add1a30ac87aa2db72f57a2375d8fec");19 String sign = WXPayUtil.generateSignature(data, config.getKey());20 data.put("sign",sign);2122 Map<String, String> resp = wxpay.unifiedOrder(data);23if ("SUCCESS".equals(resp.get("return_code"))) {24//再次签名25/** 重要的事情说三遍⼩程序⽀付所有的字段必须⼤写驼峰模式严格按照⼩程序⽀付⽂档26 *https:///wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=3#27 * ******* 我当初就因为timeStamp中S没⼤写弄了3个⼩时 **********28 * */29 Map<String, String> reData = new HashMap<>();30 reData.put("appId", config.getAppID());31 reData.put("nonceStr", resp.get("nonce_str"));32 String newPackage = "prepay_id=" + resp.get("prepay_id");33 reData.put("package", newPackage);34 reData.put("signType","MD5");35 reData.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));3637 String newSign = WXPayUtil.generateSignature(reData, config.getKey());38 resp.put("paySign",newSign);39 resp.put("timeStamp", reData.get("timeStamp"));40return resp;41 } else {42throw new FrankyErrorException(resp.get("return_msg"));43 }4445 }说明:这⾥只是说明⼩程序⽀付与微信app内⽀付的不同和遇到的问题,有关⾥⾯⽤到微信的SDK,请看上⼀篇⽂章。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档