项目需要对接三方支付,选择了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?

文档地址:无,需找客服咨询

吐槽:

  1. 接口命令格式都不同,有 . 分割的,有 _的;
  2. 后面2个接口都没有文档,要单独找客服才能拿到;
  3. 移动支付和即时到帐拼装待加密字符串的方式都不统一,找了好久才发现;
  4. 移动支付无法控制付款账户,使用信用卡也是可以的(但是支付宝风控应该可以控制信用卡付款总额度);

快钱(实现 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:

  1. amount(金额):必须是格式化过的,1.00不行,必须1.0。
  2. 限制 IP,白名单,不然提示没权限;

付款 API-查询订单(queryDeal):

请求地址:https://www.99bill.com/webapp/services/BatchPayWS

只验证用户,无需加密;

吐槽:

  1. 文档:只能由快钱客服发过来,但是 demo 基本都是可以用的,直接导入 IDEA,配置下 tomcat 就可以运行了;
  2. 接口访问方式不同,有的是 post 提交参数,有的是请求地址提交;

两者对比:

文档获取方式:支付宝胜出
  • 支付宝:可以很容易通过网站获得需要的文档。虽然有2个接口还要找客服,但是瑕不掩瑜;
  • 快钱:只能依赖客服跟进,而且从客服获得的文档也不是最新的;
接口配置:支付宝胜出
  • 支付宝:所有的接口只需要申请一套参数即可,partnerId;
  • 快钱:每个接口都有不同的配置,key 和id,有的还需要配置 IP;
接口调试:快钱胜出
  • 支付宝:
    • 移动支付的加密调试了很久才发现;
    • 账务接口返回的是 XML,需要写独立的解析方法去解析结果;
  • 快钱:demo 都跑的通,只需要把对应的方法搬到项目里即可;

总结:

还是支付宝方便点,但是可以猜测到,部分接口并没有形成闭环。例如生成了订单,自然要查询。有了生成订单的接口,但是却没有查询的接口。

快钱的接口很乱,各种返回值也是在变化。很多时候和文档都不一致。