最近在做一个外包项目,做到微信支付JSAPI的功能,看着官方文档来做的,其中也遇到不少坑的问题。在这里记录一下。我这边所用 的语言是JAVA的。
1.首先要先配置好公众号和商户号的相关配置。
这是公众号相关:
JS安全域写上自己的域名。
网页授权域名.
微信JSAPI支付授权目录,这个目录要精确到页面的上一级。比如www.xxx.com/order/pay.html 这是你的支付目录,这时候我们要写成www.xxx.com/order/这样微信才能读取得到你的目录。再者你的域名必须经过ICP备案咯。这是前提条件。
在公众号里面可以获取你的appId
在商户号里获取你的密钥和商户号
这些是下单需要用到东西哈。
详细可以查看官方文档:
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_3
2。这些都弄好之后,我们就可以开始来下单,
首先要调用统一下单接口,参考https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
这个有参数说明,有些参数是jSAPI才必须的,这个注意像openId这个就是JSAPI必须的,所以注意看后面的说明。
我们将参数封装成map再进行签名,注意我们sign不参与签名,这里必须和我们的商户KEY拼接签名。可参见
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3签名生成算法。
然后将map转成xml这个可以用工具去实现。
接下来会请求发送到微信的支付接口,这时候可能返回body不是UTF8编码,这说明也很清楚了你的body是中文的。这时候我们需要将我们的body参数转换成UTF8编码,
可以直接用new String(xx.getBytes("UTF-8"))将中文字符转成UTF-8编码。修改之后 我们再发起请求这时候如果出现签名错误说明你的签名算法有问题,自己去找吧。
在成功请求回来,微信给我们返一些我们在页面要发起的支付的数据,接口说明可以看到。
最后我们就要发起支付了,我们找到微信的接口说明
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6
这里面的参数签名不是刚刚下单接口给我们的,这个是我们发起请求的参数再进行签名的。所以不要搞混了。之前我也是因为这个搞了好久。浪费许多时间。
还有注意参数都是字符串的,像时间戳不是整型。不然可能会出现错误。然后我们把代码复制到前端 吧。
注意:onBridgeReady是一进去就会加载,所以我们需要在进行封装一下。再加个方法嵌套一下。需要的时候再调用。
最后就可以发起支付了,注意这是要在域名下面,如果发起支付出现页面未注册,那么就是你前面配置的域名路径有问题咯。
支付成功之后 还有一个回调,回调根据你统一下单的配置的回调地址,微信会访问你这个地址。
可参考https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7
这时候又有个问题了,你这个参数怎么获取。微信给我们的是xml格式的。
我们可以用request的流获取。示例如下:
InputStream inStream = request.getInputStream();
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
}
outSteam.close();
inStream.close();
String result = new String(outSteam.toByteArray(), "utf-8");// 获取微信调用我们notify_url的返回信息
这时我们可以将xml转换成map,然后我们需要验证参数的签名是否一致,我们去掉签名字段,将返回的参数跟上面的一样,加商户KEY进行签名,然后跟微信给我们的签名
进行对比,如果一致才是通过,防止假通知和模拟数据。后面就可以操作业务相关的东西了。