CocosCreator中接入Android原生实现微信支付功能
摘要
上一篇我们介绍了在CocosCreator中接入微信分享到好友、朋友圈的一些简单的操作流程,今天给大家介绍下怎么实现微信支付功能(注:只简单介绍实现方法流程并未做接收支付回调等处理)。本篇省略一开始配置问题,如有不清晰请访问https://www.zhita.wang/2021/02/02/wxSdk/
版本说明
使用 CocosCreator 的 2.4.3 版本。
实现流程
- 程序注册到微信
- 统一下单(注:需要调用后台接口进行统一下单)
- 唤起微信支付
Android代码
因上一篇文章有讲过实现方法,此处忽略注册到微信流程代码。在发起微信支付前,需要调用统一下单接口,获取”预支付交易会话标识”,统一下单(详见) 由后台操作。
请求参数如下,链接直达
1 | /** |
以上便是唤起微信支付主要代码,此处需要特别注意的是sign签名,唤起微信支付需要进行重新sign签名生成,sign签名方式有两种MD5、HMAC-SHA256,本次使用MD5签名,并只介绍前端生成方法,如果后端使用Java代码,那么代码和下方生成并没有太大差异。
在前台进行生成即安卓代码中进行(不建议使用该方法,建议后台生成后返回)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70/**
* 微信支付调起并生成签名
* data为后端返回的数据
*/
private static void signTransferWxPay (JSONObject data) {
PayReq request = new PayReq();
// 得到秒数级别时间戳
String time = String.valueOf(System.currentTimeMillis() / 1000);
try {
// 应用ID
String appId = data.getString("appId");
// 随机字符串
String nonceStr = data.getString("nonceStr");
// 扩展字段暂填写固定值Sign=WXPay
String packageI = "Sign=WXPay";
// 商户号
String partnerId = data.getString("partnerId");
// 预支付交易会话ID
String prepayId = data.getString("prepayId");
// 生成签名开始
// 字符串缓存区
StringBuffer sb = new StringBuffer();
// 参数名必须为ASCII字典序排序
sb.append("appid=").append(appId);
sb.append("&noncestr=").append(nonceStr);
sb.append("&package=").append(packageI);
sb.append("&partnerid=").append(partnerId);
sb.append("&prepayid=").append(prepayId);
sb.append("×tamp=").append(time);
// 字节转成字符串
String stringA = new String(sb);
// 这里的key为商户平台设置的密钥key,不建议写在前台
String stringSignTemp = stringA + "&key=192006250b4c09247ec02edce69f6a2d";
// 使用MD5加密,并使用toUpperCase转换成大写
String sin = getMd5(stringSignTemp).toUpperCase();
// 调起微信支付
request.appId = appId;
request.partnerId = partnerId;
request.prepayId= prepayId;
request.packageValue = packageI;
request.nonceStr= nonceStr;
request.timeStamp= time;
request.sign= sin;
// 唤起微信
api.sendReq(request);
} catch (JSONException e) {
// 抛出异常
e.printStackTrace();
}
}
/**
* MD5签名方式
*/
private static String getMd5(String str) {
byte[] bs = new byte[0];
try {
bs = MessageDigest.getInstance("MD5").digest(str.getBytes());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
StringBuilder sb = new StringBuilder(40);
for (byte x : bs) {
if ((x & 0xff) >> 4 == 0) {
sb.append("0").append(Integer.toHexString(x & 0xff));
} else {
sb.append(Integer.toHexString(x & 0xff));
}
}
return sb.toString();
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 张佰万!