技术在于积累,特此来记录一下。
好吧,我承认,在没集成过之前,觉着集成第三方支付挺不知所措的,因为不知道要在客户端做什么,是否需要配置一些参数,如商户id等等,也许你会说看官方文档啊,但是官方文档毕竟只是理论,而且是便于开发者理解的文档,比如说有些数据本来是不应该放在客户端处理的,但是文档中还是放在了客户端处理。
那么,做过之后才知道,像那些配置参数的动作都是服务端做的,至少我这里是服务端处理的,然后客户端只需要将订单信息以及支付信息发送给后台,在获得服务端返回的信息之后,调用支付接口即可。当然了,有些过程还是需要按照官方文档来的,没毛病。
当前项目中有用到两种支付:支付宝 和 微信。
两种方式对应的状态值是1 和 2。即1代表支付宝支付,2代表微信支付。
一、支付宝
选择了这种支付方式后,会向后台发送一个请求:例如
http://xxx.xxx.com/pay/order?number=xxx201704141505079695&payType=1&userToken=xxxd178a14c-ceaf-4c5e-b1ae-a619d4ba67d4&os=1&deviceId=860128035137866&pushToken=daddbd24bf40ec452aec9ed68baa7acd&versionCode=12&versionName=1.0&sign=146e742fcb1f88457a9b9fbc27aa8b82
主要是订单id,和 支付方式 这两个参数,也就是number 和 payType。
然后,后台会返回数据信息,如下:
{
"code": 1,
"data": "cGFydG5lcj0iMjA4ODQxMTk3NDgzMDY3NiImc2VsbGVyX2lkPSJjaHF6aHVveWlAam9heWUuY29tIiZvdXRfdHJhZGVfbm89IkhYRzIwMTcwNDE0MTUwNTA3OTY5NSImc3ViamVjdD0i6I6O6Zyy5pavL1NhbHVzIOmTgeWFg+aenOiUrOa1k+e8qemlruWTgSDooaXpk4HooaXooYAgNS4uLiImYm9keT0i6I6O6Zyy5pavL1NhbHVzIOmTgeWFg+aenOiUrOa1k+e8qemlruWTgSDooaXpk4HooaXooYAgNS4uLiImdG90YWxfZmVlPSI0MzcuMCImbm90aWZ5X3VybD0iaHR0cDovL29wZW4uaGl4Z28uY29tLy9wYXkvYWxpTm90aWZ5LzEuMC4wIiZzZXJ2aWNlPSJtb2JpbGUuc2VjdXJpdHlwYXkucGF5IiZwYXltZW50X3R5cGU9IjEiJl9pbnB1dF9jaGFyc2V0PSJ1dGYtOCImaXRfYl9wYXk9IjFkIiZyZXR1cm5fdXJsPSJtLmFsaWFweS5jb20iJnNpZ249ImJRTjZvdFNsVTE4VFpFRiUyQk9pQ3pnUm1oWXhMUEJ1Z3h6NyUyQnhNMUtrZ1UwakpwOEE2Vk9Xd0N0VWdEajJ0UUlLTEhZTnd2MzlwQVlySlk2YzY3aTNteVkyRSUyQkluMnBnbDF4SWt4TVRIOVpNZWRoQ1hqWXdYQ1dUSEFBWVJwY0FPOWlldGdtRTYlMkJaZGd3bzBrRndPN2pSWVVHajBrT1J1NTclMkZYRlR3dmdMbjglM0QiJnNpZ25fdHlwZT0iUlNBIg==",
"msg": "",
"field": null
}
接下来,客户端会对返回的data对应的字符串进行Base64Decode,结果如下:
partner="2088411974830676"&seller_id="gblzhuoyi@xxx.com"&out_trade_no="xxx201704141505079695"&subject="莎露斯/Salus 铁元果蔬浓缩饮品 补铁补血 5..."&body="莎露斯/Salus 铁元果蔬浓缩饮品 补铁补血 5..."&total_fee="437.0"¬ify_url="http://xxx.xxx.com//pay/aliNotify/1.0.0"&service="xxx.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="1d"&return_url="m.aliapy.com"&sign="xxxbQN6otSlU18TZEF%2BOiCzgRmhYxLPBugxz7%2BxM1KkgU0jJp8A6VOWwCtUgDj2tQIKLHYNwv39pAYrJY6c67i3myY2E%2BIn2pgl1xIkxMTH9ZMedhCXjYwXCWTHAAYRpcAO9ietgmE6%2BZdgwo0kFwO7jRYUGj0kORu57%2FXFTwvgLn8%3D"&sign_type="RSA"
这个字符串包含了订单信息以及支付信息,客户端调用支付宝支付接口将其提交给后台即可———-alipay.pay(info);
最后就是处理一下支付结果的回调。
二、微信
同样的,选择微信支付后,会向后台发送请求:
http://xxx.xxx.com/pay/order?number=xxx201704141505079695&payType=2&userToken=xxxd178a14c-ceaf-4c5e-b1ae-a619d4ba67d4&os=1&deviceId=860128035137866&pushToken=daddbd24bf40ec452aec9ed68baa7acd&versionCode=12&versionName=1.0&sign=8b2968c1c6bbc11d45e8a57b439f079a
主要是订单id,和 支付方式 这两个参数,也就是number 和 payType。
然后,后台会返回数据信息,如下:
{
"code":1,
"data":"eyJzaWduIjoiNzdFODE4NzhFOUZFQ0IxRTYxMDRBQjhBRUQ0MUY0OTkiLCJ0aW1lc3RhbXAiOjE0OTM5Njg0MjcsInBhcnRuZXJpZCI6IjEyODY3MDk0MDEiLCJub25jZXN0ciI6ImRmNGZlOGE4YmNkNWM5NWNkYjY0MGFhOTc5M2JiMzJiIiwicmV0Y29kZSI6MCwicHJlcGF5aWQiOiJ3eDIwMTcwNTA1MTUxMzQ4NWRlYTFlMGRjMDAzMDMxNTQ5MjkiLCJwYWNrYWdlIjoiU2lnbj1XWFBheSIsImFwcGlkIjoid3hhYTU4MzU1ZGRjODNiYzNjIiwicmV0bXNnIjoib2sifQ==",
"msg":"",
"field":null
}
接下来,客户端会对返回的data对应的字符串进行Base64Decode,结果如下:
{"sign":"xxx47411A5AB1B3A45497617E57511D6D1C","timestamp":1493964464,"partnerid":"xxx6709401","noncestr":"8383f931b0cefcc631f070480ef340e1","retcode":0,"prepayid":"wx2017050514074469f0c52e990990507641","package":"Sign=WXPay","appid":"wxaa58355ddc83bxxx","retmsg":"ok"}
然后客户端解析这个json数据,这样就可以拿到七个参数了:
PayReq payReq = new PayReq();
payReq.appId = wxPayJSON.getString("appid");
payReq.partnerId = wxPayJSON.getString("partnerid");
payReq.prepayId = wxPayJSON.getString("prepayid");
payReq.nonceStr = wxPayJSON.getString("noncestr");
payReq.timeStamp = wxPayJSON.getString("timestamp");
payReq.packageValue = wxPayJSON.getString("package");
payReq.sign = wxPayJSON.getString("sign");
payReq.extData = "app data"; // optional
api.sendReq(payReq);
这是调用微信支付时上传给后台的数据信息。
最后,就是处理支付结果的回调了。
好了,到这里就完事儿了,客户端真心没做太多的工作。