摘要

上一篇我们介绍了在CocosCreator中接入微信分享到好友、朋友圈的一些简单的操作流程,今天给大家介绍下怎么实现微信支付功能(注:只简单介绍实现方法流程并未做接收支付回调等处理)。本篇省略一开始配置问题,如有不清晰请访问https://www.zhita.wang/2021/02/02/wxSdk/

版本说明

使用 CocosCreator 的 2.4.3 版本。

img_name

实现流程

  1. 程序注册到微信
  2. 统一下单(注:需要调用后台接口进行统一下单)
  3. 唤起微信支付

Android代码

因上一篇文章有讲过实现方法,此处忽略注册到微信流程代码。在发起微信支付前,需要调用统一下单接口,获取”预支付交易会话标识”,统一下单(详见) 由后台操作。

请求参数如下,链接直达

img_name

  1. 唤起微信支付

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
/**
* 调起微信支付接口
* data为后端返回的数据
*/
private static void transferWxPay (JSONObject data) {
PayReq request = new PayReq();
try {
// 应用ID
request.appId = data.getString("appId");
// 商户号
request.partnerId = data.getString("partnerId");
// 预支付交易会话ID
request.prepayId= data.getString("prepayId");
// 扩展字段
request.packageValue = data.getString("packageI");
// 随机字符串
request.nonceStr= data.getString("nonceStr");
// 时间戳
request.timeStamp= data.getString("timestampI");
// 签名
request.sign= data.getString("signI");
// 唤起微信
api.sendReq(request);
} catch (JSONException e) {
// 抛出异常
e.printStackTrace();
}

}

以上便是唤起微信支付主要代码,此处需要特别注意的是sign签名,唤起微信支付需要进行重新sign签名生成,sign签名方式有两种MD5、HMAC-SHA256,本次使用MD5签名,并只介绍前端生成方法,如果后端使用Java代码,那么代码和下方生成并没有太大差异。

  1. 在前台进行生成即安卓代码中进行(不建议使用该方法,建议后台生成后返回)

    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("&timestamp=").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();
    }