对比
支付宝 | 微信 | |
---|---|---|
沙箱 | 有专门的沙箱账号 | 正式账号可以开启沙箱模式,没有专门的沙箱账号 |
还是沙箱 | 进入沙箱模式,有专门的沙箱APP,下单、付款与真实数据无异 | 微信的沙箱,只有特定的几个用例,且每个用例的金额还被固定啦 |
提交多余无用的参数 | 不会报错 | 报错 |
签名方式 | 非对称加密,私钥加密,公钥给对方来解密 | 参数+随机字符串+秘钥拼接后使用不可逆加密方法(md5、sha)生成签名,发送参数的明文、随机字符串、签名,对方通过相同的签名方法签名后对比两个签名是否一致 |
客户端证书 | 不需要 | 部分接口需要(有的要有的不要,没摸清规律,有点乱) |
调起微信支付的终端IP | 不需要 | 除了扫码支付是商家服务端IP外,其他支付接口是买家客户端IP。微信这IP校验有点搞笑,我随机实验过很多个不同的IP,一般国内的都能正常完成支付流程,国外的IP和局域网的都不行 |
notify_url | 非必填项,且对带不带参数无要求 | 必填项,我不想让你通知都不行?还不能带参数? |
检查域名和Referer | 不检查 | 检查,支付页面不能用新窗口打开(没有Referer),Referer中的域名与微信配置中还要一致 |
PC端支付 | 携带组织好的参数跳转到支付宝网页,可以网页登陆付款,也可以支付宝APP扫码(二维码由支付宝提供)付款 | 没有网页版支付功能,需要借助NATIVE(扫码支付),商家自己生成二维码 |
手机H5支付 | 携带组织好的参数直接跳转到支付宝指定的H5网页,由支付宝判断如何发起支付,不区分APP内外部 | 微信APP外部:商户服务端调用微信的下单接口,微信接口返回一个微信网页地址,跳转到返回的地址(可以选择带不带回退地址redirect_url),由微信网页发起支付。微信APP内部:商户服务端调用微信的下单接口,微信接口返回支付需要的数据,再由商户的服务端按照微信规则重新组装数据后返回给前端,由JS发起支付 |
APP支付 | 组织好参数,返回给APP,由APP发起支付 | 商户服务端调用微信的下单接口,微信接口返回支付需要的数据,再由商户的服务端按照微信要求的规则重新组织数据后返回给APP,由APP发起支付 |
小程序支付 | 商户服务端调用支付宝下单接口,支付宝接口返回支付需要的数据,再由商户服务端返回数据给小程序,有小程序发起支付 | 商户服务端调用微信的下单接口,微信接口返回支付需要的数据,再由商户服务端按照微信要求的规则重新组织数据后返回给小程序,由小程序发起支付 |
扫码支付 | 商户服务端调用支付宝下单接口,支付宝接口返回二维码串,由商户服务端转换为二维码图片供用户扫描 | 同支付宝 |
付款码支付 | 收银员使用扫码设备扫描获取用户支付宝APP上的付款码,上传到商户服务端,由商户服务端调用支付宝支付接口完成支付 | 同支付宝 |
return_url的处理 | 支付完成才回跳 | 尝试唤起微信APP 5 秒后进行回跳,不管有没有唤起APP,唤起了有没有支付,支付了有没有支付成功。需要自己在回跳后的页面做个按钮“已完成付款”,让用户手动点,不要自动检查 |
支付宝各操作接口主要参数概览
说明: 虽然支付宝官方文档将 method
和 notify
、return_url
划分在公共参数,但在不同的接口它们有不同的表现,故此这里将它们放在其他请求参数表中对照
公共参数:
应用ID app_id | 数据格式 format | 字符集 charset | 签名算法 sign_typ | 签名 sign | 时间戳 timestamp | 调用的接口版本 version | 业务参数 biz_content | 第三方授权码 app_auth_token |
---|---|---|---|---|---|---|---|---|
必填 | 固定为JSON | 必填 | 必填,RSA2和RSA,推荐RSA2 | 必填 | 必填 | 固定为1.0 | 必填 | 非必填 |
其他请求参数
接口名称 method | 通知地址 notify_url | 回退地址 return_url | 销售产品码(特殊的业务参数) product_code | 业务参数 | |
---|---|---|---|---|---|
PC端支付 | alipay.trade.page.pay | 非必填 | 非必填 | FAST_INSTANT_TRADE_PAY | 商户订单号 out_trade_no;商品标题 subject;商品金额 total_amount |
H5支付 | alipay.trade.wap.pay | 非必填 | 非必填 | QUICK_WAP_WAY | 商户订单号 out_trade_no;商品标题 subject;商品金额 total_amount |
APP支付 | alipay.trade.app.pay | 非必填 | 非必填 | QUICK_MSECURITY_PAY | 商户订单号 out_trade_no;商品标题 subject;商品金额 total_amount |
小程序支付 | alipay.trade.create | 非必填 | 无此参数 | FACE_TO_FACE_PAYMENT | 商户订单号 out_trade_no;商品标题 subject;商品金额 total_amount;买家用户号 buyer_id |
扫码支付 | alipay.trade.precreate | 非必填 | 无此参数 | FACE_TO_FACE_PAYMENT | 商户订单号 out_trade_no;商品标题 subject;商品金额 total_amount |
付款码支付 | alipay.trade.pay | 非必填 | 无此参数 | FACE_TO_FACE_PAYMENT | 商户订单号 out_trade_no;商品标题 subject;商品金额 total_amount;付款码 auth_code |
订单查询 | alipay.trade.query | 无此参数 | 无此参数 | 无此参数 | 商户订单号 out_trade_no 和支付宝交易号 trade_no 二选一 |
关闭订单 | alipay.trade.close | 非必填 | 无此参数 | 无此参数 | 商户订单号 out_trade_no 和支付宝交易号 trade_no 二选一 |
撤销订单 | alipay.trade.cancel | 无此参数 | 无此参数 | 无此参数 | 商户订单号 out_trade_no 和支付宝交易号 trade_no 二选一 |
申请退款 | alipay.trade.refund | 无此参数 | 无此参数 | 无此参数 | 商户订单号 out_trade_no 和支付宝交易号 trade_no 二选一;退款金额 refund_amount;商户退款单号 out_request_no,部分退款此参数必填; |
退款查询 | alipay.trade.fastpay.refund.query | 无此参数 | 无此参数 | 无此参数 | 商户订单号 out_trade_no 和支付宝交易号 trade_no 二选一;商户退款单号 out_request_no,若退款时未传入,则该值为商户订单号; |
微信各操作接口主要参数概览
说明: 微信官方没有区分公共参数,但根据接口的实际情况,参数 appid
、 mch_id
、 nonce_str
、 sign
、 sign_type
在每个接口中均有使用,且表现一致,故此将它们归类到公共参数
公共参数
应用ID appid | 商户ID mch_id | 随机字符串 nonce_str | 签名 sign | 签名算法 sign_type |
---|---|---|---|---|
必填 | 必填 | 必填 | 必填 | 非必填,MD5和HMAC-SHA256,默认MD5 |
其他请求参数
接口名称 method | 是否需要证书 | 调起微信支付的终端IP spbill_create_ip | 通知地址 notify_url | 交易类型 trade_type | 业务参数 | |
---|---|---|---|---|---|---|
没有专门的PC网页支付(借助扫码支付) | ||||||
H5支付(微信外部) | pay/unifiedorder | 不需要 | 必填,买家客户端IP | 必填 | MWEB | 商品描述 body;商户订单号 out_trade_no;订单金额 total_fee |
APP支付 | pay/unifiedorder | 不需要 | 必填,买家客户端IP | 必填 | APP | 商品描述 body;商户订单号 out_trade_no;订单金额 total_fee |
小程序支付 | pay/unifiedorder | 不需要 | 必填,买家客户端IP | 必填 | JSAPI | 商品描述 body;商户订单号 out_trade_no;订单金额 total_fee;用户标识 openid |
JSAPI支付,即微信内部H5支付 | pay/unifiedorder | 不需要 | 必填,买家客户端IP | 必填 | JSAPI | 商品描述 body;商户订单号 out_trade_no;订单金额 total_fee;用户标识 openid |
扫码支付 | pay/unifiedorder | 不需要 | 必填,买家客户端IP | 必填 | NATIVE | 商品描述 body;商户订单号 out_trade_no;订单金额 total_fee |
付款码支付 | pay/micropay | 不需要 | 必填,商户服务器IP | 必填 | 无此参数 | 商品描述 body;商户订单号 out_trade_no;订单金额 total_fee;付款码 auth_code |
订单查询 | pay/orderquery | 不需要 | 无此参数 | 无此参数 | 无此参数 | 商户订单号 out_trade_no 和微信订单号 transaction_id 二选一 |
关闭订单 | pay/closeorder | 不需要 | 无此参数 | 无此参数 | 无此参数 | 商户订单号 out_trade_no |
申请退款 | secapi/pay/refund | 需要 | 无此参数 | 非必填 | 无此参数 | 商户订单号 out_trade_no 和微信订单号 transaction_id 二选一;商户退款单号 out_refund_no;订单金额 total_fee;退款金额 refund_fee; |
退款查询 | pay/refundquery | 不需要 | 无此参数 | 五次参数 | 无此参数 | 微信订单号 transaction_id 、商户订单号 out_trade_no 、商户退款单号 out_refund_no 和微信退款单号 refund_id 四选一,退款单号优先级高于订单号,传订单号返回该订单的所有退款 |
微信坑点
H5支付下单接口,文档中
scene_info
要求必填,实际测试不填也不影响Native支付下单接口,文档中
product_id
要求必填,实际测试不填也不影响微信参数命名真特么牛逼,一个应用ID能玩出几个花样,
appid
app_id
appId
都什么鬼,还有timestamp
和timeStamp
、noncestr
和nonceStr
。
支付宝坑点
- product_code的值文档描述有点混乱,有的仅给了示例值,无法清楚的知道每种支付方式支持的值有哪些
通过搜索问题,官方 在这里 给出了标准答案:
product_code固定参数值:- app支付product_code:QUICK_MSECURITY_PAY;
- 手机网站支付product_code:QUICK_WAP_WAY;
- 电脑网站支付product_code:FAST_INSTANT_TRADE_PAY;
- 统一收单交易支付接口product_code:FACE_TO_FACE_PAYMENT;
官方文档地址
微信:https://pay.weixin.qq.com/wiki/doc/api/index.html
支付宝: https://docs.open.alipay.com/api