zZ爱吃菜

[php] 关于微信支付

写在前面

微信支付的一些记录,主要是针对于 微信退款 功能。后续有时间补全其他

微信账户类型分类

  • 普通商户版
  • 服务商版
  • 银行服务商版

我主要使用过 普通商户 和 服务商商户,他们之间是有区别的,例如 普通商户只是一个独立的商户,而 服务商则是一个集合,分管很多个普通商户,所有在做微信支付相关功能是的接口参数也是有不同。主要是: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参数格式错误.

我的原因是:不小心把金额写错成了 浮点数。接口的金额单位是:分,整型。

基本账户余额不足,请充值后重新发起

这个问题是因为微信支付是需要扣手续费的,到时原金额退款时,账户金额不足导致的。走到这一步就说明你的程序已经没有问题了。剩下就是子商户资金管理相关的。

码字很辛苦,转载请注明来自L&N 博客《[php] 关于微信支付》

评论