最近为公司开发一个新功能,具体是什么不重要,主要是这个功能需要对接微信支付,需要在微信页面调起微信支付
基本上我也是初次接触微信支付的对接,所以我先去看了微信的支付开发文档地址如下:
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1
在这里我采用的是JSAPI来调起微信支付,这个具体的方法和它的名字很对应,就是利用H5页面的微信内置的js来调起微信支付
当然,想要在微信公众号里调支付,我就需要知道公众号的appID,API密钥,和商户号,这是一切的基础
然后我们需要在微信的支付开发文档中找到统一下单接口的页面
在这个页面中微信告诉了我们几点
1.他的接口地址:https://api.mch.weixin.qq.com/pay/unifiedorder
2.需要传给微信这个地址的一系列参数
对于一些很常见的参数我就不再说明,这里我重点将几个比较容易发生错误的参数进行讲解:
1.nonce_str
nonce_str参数需要一定的方法生成,代码如下
//生成随机字符串
public static String CreateNoncestr() {
String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
String res = "";
for (int i = 0; i < 16; i++) {
Random rd = new Random();
res += chars.charAt(rd.nextInt(chars.length() - 1));
}
return res;
}
2.out_trade_no
商户订单号:随机生成,唯一:生成代码如下
String trade_no = UUID.randomUUID().toString().substring(0, 15);
我这里通过substring方法将其取成16个字符
3.total_fee
这里注意金额单位为分,需要自行转化
4.notify_url
这个地址配置的是用户支付完成后,微信将会回调的一个地址,你可以配置在自己的项目中,微信回调时会带一系列的参数回来等下有详细说明
5.openid
因为是在微信公众号里进行的,所以必须要穿用户唯一标识openid
6.sign
签名可以说是最容易出错的一个参数了,他需要你将前面的所有参数放置在对象中后,对该对象进行重新的前面加密具体代码如下
SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
parameters.put("appid", ConfigUtil.APPID);
parameters.put("mch_id", ConfigUtil.MCH_ID);
parameters.put("nonce_str", WeixinPay.CreateNoncestr());
parameters.put("body", message);
String trade_no = UUID.randomUUID().toString().substring(0, 15);
parameters.put("out_trade_no", trade_no); //订单id
parameters.put("fee_type", "CNY");
parameters.put("total_fee", String.valueOf(price100));
parameters.put("spbill_create_ip", "127.0.0.1");
parameters.put("notify_url", returnUrl);
parameters.put("trade_type", "JSAPI");
String openid = (String)request.getSession().getAttribute("wechat");
parameters.put("openid", openid);
String sign = WeixinPay.createSign