市面上主流的第三方支付方式
现在最主流的第三方支付方式应该是支付宝,微信支付,还有银联支付这三种,非主流的还有比如京东支付,以及下文需要提到的连连支付,电信公司的翼支付等等.前段时间的项目中用到了微信支付还有连连支付,翼支付这些小众的支付方式,个人觉得后面这两种支付方式略微奇葩,用的人真心少,然并卵,客户是老大,给钱的是大爷,所以只能吐槽一下,该写的代码还是要写,该读的文档还是要读.PS:本文所分享的微信支付以及其余支付都是针对APP支付,并且是服务端的代码,如果接下来的项目中会用到例如微信公众号支付,Js支付时会补充该文.
支付大体流程概述
做了这三种支付,个人感觉支付大体流程都是相同的,如下:
1.App调用后台接口,传入第三方支付所需要的必要参数,服务端进行数据校验,确保数据真实性 2.服务端获得App传递的参数,按照第三方支付的要求进行数据加签或者比如微信需要服务端主动请求微信服务器先获得预支付订单号,服务端进行数据入库 3.服务端将处理好的必要的支付参数传递给App端,App调用第三方SDK进行支付
要说有区别的就是传参类型,回调接口传参方式不一样而已,我们需要注意的是如何保证自己系统的业务数据状态正常,还有就是安全问题,因为前段时间的项目被人攻击了,而自己写的代码严谨性不够,导致...........哎,记录下来留作警示吧.
微信APP支付步骤以及关键代码
无论做哪一种第三方支付,研读它的文档对于开发人员来说都是必须的,所以阅读第三方文档的能力对于IT这一行来说是至关重要的. 微信支付官方文档
读过App支付相关章节我们可以发现,微信支付首先需要服务端主动请求微信服务器,获取此次支付的预支付订单号,并且说明了选传必传的参数,下面只列出必传的参数,具体参数含义请阅读官方文档统一下单章节:
1.appid 公众账号ID 2.mch_id 商户号 3.nonce_str 随机字符串 4.sign 签名 5.body 商品描述 6.out_trade_no 商户订单号 7.total_fee 总金额(单位为分) 8.spbill_create_ip 终端IP 9.notify_url 通知地址 10.trade_type 交易类型
sign需要服务端将上面的参数按照字典表进行排序,组成如下的形式:
appid=XXX&body=XXX&mch_id=XXX......
接下来我们需要使用上一步组装好的字符串最后加上微信提供给你的appkey,假设上一步获得的字符串名称为paramStr:
paramStr&key=YourAppKeyValue
最后我们将上面的字符串进行32位MD5加密并且转大写得到最终sign参数的值.最后将sign与上面所说的必填参数组装成xml文件发送给微信服务器,官方示例:
<xml> <appid>xxx</appid> <attach>支付测试</attach> <body>APP支付测试</body> <mch_id>xxx</mch_id> <nonce_str>xxxx</nonce_str> <notify_url>xxx</notify_url> <out_trade_no>xxxx</out_trade_no> <spbill_create_ip>127.0.0.1</spbill_create_ip> <total_fee>1</total_fee> <trade_type>APP</trade_type> <sign>xxxx</sign> </xml>
上述步骤的工具类以及http请求的代码这里就不分享了吧,实现起来很简单.请求发送过去之后,如果上述步骤中的参数没有错误的话,微信会返回给服务端一串xml,我们只需要获取其节点中的prepay_id字段的值,再参照文档中的调起支付接口章节中的必传参数列表:
1.appid 公众账号ID 2.partnerid 商户号 3.prepayid 预支付交易会话ID 4.package 暂填写固定值Sign=WXPay 5.noncestr 随机字符串 6.timestamp 时间戳 7.sign 签名
这个接口中的sign的生成方法和统一下单接口方式一样.
最后我们将调起支付接口中的参数传递给App端,App端的开发人员参照APP SDK开发文档使用服务器端传递的参数调起微信支付.
App端支付成功之后,会有同步回调通知与异步回调通知,后台开发人员只关心异步回调通知,异步回调地址是我们在统一下单章节中参数notify_url所决定的.
这里需要吐槽微信官方的是,官方文档中只写了返回的字段名称以及含义,并没有说明是以何种方式返回的,最后是通过debug的方式确定返回的方式,代码如下:
StringBuffer sb = new StringBuffer(); InputStream is = request.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String s = ""; while ((s = br.readLine()) != null) { sb.append(s); } logger.info("******微信回调通知内容*****" + sb.toString());
处理回调方法的时候需要注意的是需要对回调的内容进行验签处理,防止别人伪造数据,比如:实际支付了一分钱,随后伪造微信通知,而你收到通知如果不做校验继续执行了类似于充值的业务,损失就大了.
Comments !