接入三方支付(支付宝和快钱)
项目需要对接三方支付,选择了2家提供商:支付宝和快钱。这里按照需求和接入的接口简单对比一下:
支付宝(实现 web 和移动端购买)
移动支付(mobile.security.pay
):
请求地址:https://openapi.alipay.com/gateway.do?
请求参数:
加密方式:MD5
加密字段:拼装成 Map,加密前按照 key 对 Map 排序,按照 key=“value” 的模式用 & 拼装成字符串。
返回值:
- 同步通知:
- 异步回调:
即时到帐(create_direct_pay_by_user
):
请求地址:https://openapi.alipay.com/gateway.do?
请求参数:
加密方式:MD5
加密字段:拼装成 Map,加密前按照 key 对 Map 排序,按照 key=value 的模式用 & 拼装成字符串。
还要注意的是: 进行MD5签名之前必须用中文原文,但是http传输的时候必须进行urlencode转码。
如果不做这个,chrome可以,IE不行。
返回值:
- 同步通知:
- 异步回调:
单笔订单查询(single_trade_query
):
请求地址:https://openapi.alipay.com/gateway.do?
文档地址:无,需找客服咨询
账务明细分页查询(account.page.query
):
请求地址:https://openapi.alipay.com/gateway.do?
文档地址:无,需找客服咨询
吐槽:
- 接口命令格式都不同,有 . 分割的,有
_
的; - 后面2个接口都没有文档,要单独找客服才能拿到;
- 移动支付和即时到帐拼装待加密字符串的方式都不统一,找了好久才发现;
- 移动支付无法控制付款账户,使用信用卡也是可以的(但是支付宝风控应该可以控制信用卡付款总额度);
快钱(实现 web 支付和提现)
人民币网关支付接口:
请求地址:https://www.99bill.com/gateway/recvMerchantInfoAction.htm
请求参数:
加密方式:RSA
加密字段:按照 demo 的固定顺序加密。
然后 post 提交所有参数给请求地址,成功即弹出正确的页面。
返回值:
- 异步通知:RSA 方式解密校验。
人民币网关查询接口(gatewayOrderQuery):
请求地址:https://www.99bill.com/apipay/services/gatewayOrderQuery
请求参数:
加密方式:MD5
加密字段:按照 demo 的固定顺序加密。
返回值:
加密方式:MD5
加密字段:按照 demo 的固定顺序加密然后校验。
付款 API-付款到银行(bankPay):
请求地址:https://www.99bill.com/webapp/services/BatchPayWS
请求参数:
加密方式:MD5
加密字段:bankCardNumber + amount + orderId + key
返回值:
加密方式和字段同请求参数;
PS:
- amount(金额):必须是格式化过的,1.00不行,必须1.0。
- 限制 IP,白名单,不然提示没权限;
付款 API-查询订单(queryDeal):
请求地址:https://www.99bill.com/webapp/services/BatchPayWS
只验证用户,无需加密;
吐槽:
- 文档:只能由快钱客服发过来,但是 demo 基本都是可以用的,直接导入 IDEA,配置下 tomcat 就可以运行了;
- 接口访问方式不同,有的是 post 提交参数,有的是请求地址提交;
两者对比:
文档获取方式:支付宝胜出
- 支付宝:可以很容易通过网站获得需要的文档。虽然有2个接口还要找客服,但是瑕不掩瑜;
- 快钱:只能依赖客服跟进,而且从客服获得的文档也不是最新的;
接口配置:支付宝胜出
- 支付宝:所有的接口只需要申请一套参数即可,partnerId;
- 快钱:每个接口都有不同的配置,key 和id,有的还需要配置 IP;
接口调试:快钱胜出
- 支付宝:
- 移动支付的加密调试了很久才发现;
- 账务接口返回的是 XML,需要写独立的解析方法去解析结果;
- 快钱:demo 都跑的通,只需要把对应的方法搬到项目里即可;
总结:
还是支付宝方便点,但是可以猜测到,部分接口并没有形成闭环。例如生成了订单,自然要查询。有了生成订单的接口,但是却没有查询的接口。
快钱的接口很乱,各种返回值也是在变化。很多时候和文档都不一致。