关于微信支付
写在前面
微信支付的一些记录,主要是针对于 微信退款 功能。后续有时间补全其他
微信账户类型分类
- 普通商户版
- 服务商版
- 银行服务商版
我主要使用过 普通商户 和 服务商商户,他们之间是有区别的,例如 普通商户只是一个独立的商户,而 服务商则是一个集合,分管很多个普通商户,所有在做微信支付相关功能是的接口参数也是有不同。主要是:sub_appid【子商户公众账号ID】 和 sub_mch_id【子商户号】
服务商理解
服务商,可以管理一批普通商户,然后这一需要一套支付证书即服务商证书即可,只是在做支付退款等功能,参数传入 sub_appid( 非必需)和 sub_mch_id(必须)就可以对服务商下子商户进行支付和退款等相关的操作。
爬坑:
微信提供的 demo 本身是不支持 服务商的,需要自己修改类库源码
微信提供的支付PHP类库主要有:
WxPay.Api.php # 主要的接口操作
WxPay.Config.Interface.php # 配置信息的接口模板
WxPay.Config.php # 主要支付账户信息的配置,例如:APPID、MCHID:商户号 等。
WxPay.Data.php # 接口提交的数据结构体。
# 可以这样理解类库操作
$config = new WxPayConfig(); # 获取微信账户配置信息
$input = new WxPayRefund(); # 获取需要支付提交的数据。
WxPayApi::refund($config, $input);
# 注意:在做子商户信息提交时,我在 WxPayRefund 添加 SetSubMch_id 方法,即为 SetSubMch_id protected 属性 插入新的参数:sub_mch_id。
我遇到的错误
58 错误
是因为 SSL 证书的路径错误,我之前用了 http 地址,这是不对的。需要使用服务器的绝对路径。
60 错误
通常是 SSL 证书严格校验导致
// 在 WxPay.Api.php 中做如下修改
// curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
// curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //严格校验
0参数格式错误
API 请求成功了,但是返回的是 return_code: FAIL,return_msg: 0参数格式错误.
我的原因是:不小心把金额写错成了 浮点数。接口的金额单位是:分,整型。
基本账户余额不足,请充值后重新发起
这个问题是因为微信支付是需要扣手续费的,到时原金额退款时,账户金额不足导致的。走到这一步就说明你的程序已经没有问题了。剩下就是子商户资金管理相关的。