最近两个星期在搞微信的公众号支付时,遇到了不少坑,现将记得的总结下来:
1、首先是商户申请微信支付后得到支付商户号和商户秘钥。
2、有了上面两个东西后,再加上公众号的appid和微信用户的openid即可调用微信的统一下单接口
3、在https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1这个开发文档中有统一下单接口文档说明,其中通知地址字段,也是一个自己写的一个接口,当在微信输完密码后会自动调用此接口;交易类型字段如果是公众号支付,那么填写为JSAPI,用户标识即openid当是公众号支付时,此字段也必须填。
4、这些字段都用一个对象保存起来后就可以进行md5加密签名了,然后继续将签名存到对象中,将此对象去调用微信的统一下单接口
UnifiedorderResult unifiedorderResult = PayMchAPI.payUnifiedorder(unifiedorder); public static UnifiedorderResult payUnifiedorder(Unifiedorder unifiedorder){ String unifiedorderXML = XMLConverUtil.convertToXML(unifiedorder); log.info(unifiedorderXML); HttpUriRequest httpUriRequest = RequestBuilder.post() .setHeader(xmlHeader) .setUri(MCH_URI + "/pay/unifiedorder") .setEntity(new StringEntity(unifiedorderXML,Charset.forName("utf-8"))) .build(); return LocalHttpClient.executeXmlResult(httpUriRequest,UnifiedorderResult.class); }
5、调用统一下单接口之后,查看一下返回值是否成功getReturn_code,成功的话,就可以重新组装一个对象,此对象用来调用微信的js唤起输入密码的窗口,对象所需要的参数也是在https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6此接口文档中有说明,其中对象中的参数必须与文档所要求的参数一致,大小写都必须一致,因为对象中有个签名字段,此字段的值是拿其他字段来进行md5加密后的
6、用后台返回的json对象为微信js所需要的参数进行赋值,如果没问题,便能成功唤起微信的输入密码界面。
7、输完密码后,微信便会调用你的回调接口,之后就完成了。
8、微信公众号中还要设置支付授权目录,在微信支付-开发配置下面填写。比如你的支付界面的地址是a/b/c,则这里的
支付授权目录为a/b/,即将最右边斜杠后面的都删掉即可。
因为是第一次弄微信支付,所以也只是把一些大概整理一下,因为是调用别人写好的一些封装,所以还有很多底层代码的封装还没怎么细看。现在只是记录个微信支付流程的大概步骤。