微信支付服务商模式采坑记录
微信支付小程序服务商模式的实现,官方文档写的简直格外坑爹.开发文档地址:微信支付小程序服务商模式开发文档
统一下单
几个注意点:
- 非沙箱环境的下单请求地址是:https://api.mch.weixin.qq.com/pay/unifiedorder
- 不需要证书
- 统一下单的几个需要注意的参数,下边是参数列表
描述 |
变量名 |
必填 |
类型 |
你申请服务商模式公众号的appid |
appid |
是 |
String(32) |
你申请服务商模式的商户号 |
mch_id |
是 |
String(32) |
特约服务商的小程序appid或者公众号appid(也可以是服务商自己的小程序appid,前提是特约商户是这个服务商的特约商户) |
sub_appid |
是 |
String(32) |
特约商户号(去服务商的账号的特约商户管理里边看) |
sub_mch_id |
是 |
String(32) |
统一用MD5 |
sign_type |
是 |
String(32) |
自己系统的订单号 |
out_trade_no |
是 |
String(32) |
需要支付的金额,单位是分 |
total_fee |
是 |
int |
支付异步通知回调地址,注意长度 |
notify_url |
是 |
String(256) |
交易类型,小程序的是JSAPI |
trade_type |
是 |
String(16) |
什么也不说了,这个不传 |
openid |
否 |
String(128) |
trade_type=JSAPI,此参数必传,特别需要注意: 这个是sub_appid对应的小程序或者公众号下的openid |
sub_openid |
是 |
String(128) |
服务商账号的api key |
key |
是 |
string |
- 参数需要加密,加密的时候不包含sign字段,这个是加密其他参数以后补充进去的,再有就是一定要在通过ASCII码从小到大排序的字符串最后加上&key=xxx这个值再进行加密.自己看开发文档就行,这个说的挺清楚的.
- 返回的时候return_code和result_code都是SUCCESS才算成功
- 除了返回的prepay_id有大用,其他的都可以直接忽略,千万记住,不要用除了prepay_id以外的任何返回值充当下一个接口的参数.
支付异步通知
- 一定要能调通!一定要能调通!一定要能调通!重要的事情说三遍
- 回调地址检查仔细,比如说开发人员不知道服务器那边配置的负载或者代理配置了其他前缀而忽略了,就会造成开发环境可以,一上生产就完蛋!
- 一定要做签名验证和金额效验以及其他的验证,最后保留transaction_id到数据库
- 通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 总计 24h4m)
申请退款
- 需要证书,证书下载去服务商账号下自己去按照要求配置并下载就行,证书的密码默认就是服务商的appid,分布式项目中不要将证书进行RPC传输
- 请求频率限制:150qps,即每秒钟正常的申请退款请求次数不超过150次,错误或无效请求频率限制:6qps,即每秒钟异常或错误的退款申请请求不超过6次.
- 入参的要求和统一下单的那些基本参数一样,额外多了transaction_id的传入而已,没什么可说的,只不过参数不一样而已,基本参数还是一样的.金额也是分
- 需要注意的是:服务商必须给特约商户开通退款平台权限和退款API权限才能正常退款,比较恶心,操作起来挺繁琐的.