本人做过微信与支付宝的支付、退款以及现金支付功能(公司项目上线了),其他功能只能靠文档以及自己开发测试验证了,现对支付中出现的各种问题进行下总结(微信支付做的比较多,踩的坑多一些)
这里只说写官方文档上不详细的地方
微信支付
关键开发点:
- 商户信息
- 商户api key:一个字符串,相当于接口密码
- 商户id:mch_id
- 接口证书(可选):下单接口不需要,但像退款、企业付款等接口需要
- 不同支付方式所需信息
- 公众号
- appid
- openid (用户授权后才可以获取到)
- App
- appid app在开放平台上注册后就可以获取到
- H5
- appid 公众号appId
- 公众号
- 其他关键信息
- 商品价格(total_fee) 单位是分 不能有小数点
- 商品详情 (body) 会在支付窗口上显示 一般都用商品名字
- 终端ip(spbill_create_ip) 支付所用客户端的ip 实测表明微信不会验证真实性 随便填一个也行 毕竟获取真实ip有难度,开心。。。
- 接口协议 https
- 传输数据格式 xml
- 加密算法 AES MD5
- 陷阱点
- 各种支付方式中下单参数包含一个支付回调url,需要在商户平台中配置,以/结尾,比如真实的网页url为 http://xxx.com/test/pay 则可配置http://xxx.com/test/,最多配置个url,因此更多个地址时可通过修改斜杠后面的地址
- xml中若是包含中文 一定要<![CDATA[]]>包起来,还要注意长度,微信对中文长度的计算不是按照字符1:1计算的,一个中文是3个长度,一个英文是一个长度,尽量不使用中文
- 企业转账接口与红包要求微信号必须实名,否则请求操作会失败
- 验证签名时要把sign参数排除出去,只选取其他参数,生成验证签名后再与其进行比较
- 微信接口出现异常返回值的概率较低,但并发速度足够高厚,可能会出现异常,比如xml中错误信息为“系统异常”的返回值开始出现,开发测试时由于频率低很难调试出这种情况
- 下单时没有返回微信那边的订单号,返回的prepay_id是一个预订单号,是用来调起来支付窗口用的参数,只有支付之后的异步通知或者订单查看请求返回值中才包含真正的微信订单号transaction_id,这个预订单号默认只有2小时有效期,可以下单时指定有效期
- 接口参数中的时间戳单位是秒 , 不是毫秒
- 下单时生成签名时用的签名方式与使用预订单号生成调起支付窗口时的签名方式要一致,否则调用支付窗口时会一直提示签名错误。签名方式只有2种:HMAC-SHA256和MD5,默认为MD5
- 客户端支付成功或者取消后有结果回调函数,但微信文档上明确说明这个是不绝对可靠的,因此是否实际支付成功要靠异步通知或者主动调用订单查看接口,采用哪种方式看架构设计
支付宝支付
关键开发点:
-
商户信息
- appid 注册一个应用会自动生成 不可更改
- 秘钥 需要在开放 平台上设置 应用公钥与私钥可利用平台提供的工具生成
- 支付宝公钥(sdk必要参数)从平台上下载即可
- 支付宝应用公钥 需要上传保存到开放平台上面
- 支付宝应用私钥(sdk必要参数)不需要上传 保存在本地即可
-
其他关键信息
- 商品价格 单位元 精确到2位小数
-
接口交互协议 https
-
数据格式 JSON
-
注意点:
- 支付宝sdk中有些参数是多余的 如客户端对象构造参数中包含3个秘钥,其实实际只用得上2个,加解密原理如下
①:商户上传自己的商户公钥到支付宝服务器
②:使用商户私钥加密请求参数
③:加密以后的参数请求到支付宝
④:支付宝服务器使用商户上传的商户公钥,解密商户请求参数,并处理支付结果
⑤:对商户支付结果使用支付宝私钥加密
⑥:商户使用支付宝公钥验签支付返回的支付结果 - 下单参数中尽量全使用英文字母 标题(subject)可使用全中文 尽量不使用未验证过的字符,否则可能会出现参数错误提示,支付宝也没说明哪些字符是非法的,线上吃过好大的亏,至于长度计算文档上一些说明会指出多少个汉字上限,否则应该验证实际长度上限,(这点比微信强多了,起码对汉字的支持要好)
- 支付宝sdk中有些参数是多余的 如客户端对象构造参数中包含3个秘钥,其实实际只用得上2个,加解密原理如下