搞了下微信的支付,坑点也有不少,参考了其他老鸟的做法,少走一些弯路,他里面描述的我就不重复了,申请参数什么的,到微信的后台去搞,
https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=9_1,主要看服务端的下单接口和回调接口、客户端调起支付接口,这里给下其他大牛参考的网址
http://blog.csdn.net/janice0529/article/details/38051987
http://www.360doc.com/content/15/0214/10/7044580_448519997.shtml
流程看上面这两个地址,他们那有说明了,官网上也有,废话不多说,直接上代码
服务端,客户端自定的参数上传到自己的服务器,密钥这种就不在网络上传输,在服务端配置文件或者从数据库中获取也行,看各自需要
组装参数向微信服务器post请求获得prepayid,各参数获得方式这里不多写
签名的生成方式是按照key的升序,值的排列,中间加上&拼接,在后面加上密钥,然后md5生成,到这个网址去试下参数生成的sign是否一样,这样比省事
https://pay.weixin.qq.com/wiki/tools/signverify/
生成要post的xml字符串方法
CDATA那个标签,加不加好像没影响,照他官网上的写就行,post过去掉了下坑,一直是返回格式错误,原来是我的post方法有问题,对方一直返回错误,但又不是说是post问题,下面是我的post方法,后面记得关闭流
得到的结果是xml,解析那里就不写了,网上找下很多的,拿到prepayid之后,再拼装参数,按客户端的要求生成指定的sign, 这步放在服务器上操作,安全性高一些,客户端不要存放密钥,当然不考虑安全性的另外说,
服务端生成返给客户端的sign
客户接收并解析,调出支付
客户端从上面的对自己服务器发起请求,服务器再向微信获得prepayid,再返回给客户端,客户端解析拿得调起微信所需要的参数,主要的就是那个sign,就是上面代码生成的这个sign,微信的客户端收到后,校验都成功,当然APK要签名后的,也就是和在后台填写的那个APK的签名相同,这样就能调起支付了,客户端
接下来就是微信的支付付操作界面,这些就不管了,等他操作完后,服务器会收到微信的异步通知,在下单接口的那步填写的通知地址会收到来自微信的消息,解析他的xml,签名的校验也是和上面的方法相同,就是把他返回的值都当作参数进行排列,sign排除,接上自己的密钥,md5字符串后生成的值,和他的sign比绞,相同的则认为是微信发来的并且没有被人篡改,然后将结果入库,并更新自己对应的那个订单的状态,更新成是支付成功。在上面的客户端代码中,在界面的显示支付成功后,回到主线程去查询刚才的订单结果,整个过程到此结束.