-- 微信支付-企业付款给个人(可做提现,给付,理赔,退款等业务)
【官网】:https://pay.weixin.qq.com/
应用场景
企业付款业务是基于微信支付商户平台的资金管理能力,为了协助商户方便地实现企业向个人付款,针对部分有开发能力的商户,提供通过API完成企业付款的功能。 比如目前的保险行业向客户退保、给付、理赔。 企业付款将使用商户的可用余额,需确保可用余额充足。基础资源
微信支付平台的商户账号,开通相关的支付服务
使用须知
所有涉及的商户账号,密码,秘钥都要安全保存,避免泄露。另外对于调用接口本身要做好预先记录,审核,风控措施等。
配置步骤
>接口说明。
<企业付款>:
用于企业向微信用户个人付款,目前支持向指定微信用户的openid付款。(获取openid参见微信公众平台开发者文档)
<接口地址>
https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers
<接口规则>
请求需要双向证书
参数详见微信支付官方文档
调用接口应该配合一个事务,而且事务方面要有相关的事务锁。注意并发性和防止订单的重复操作。
<业务规则>
◆ 给同一个实名用户付款,单笔单日限额2W/2W
◆ 不支持给非实名用户打款
◆ 一个商户同一日付款总额限额100W
◆ 单笔最小金额默认为1元
◆ 每个用户每天最多可付款10次,可以在商户平台--API安全进行设置
◆ 给同一个用户付款时间间隔不得低于15秒
注意1-当返回错误码为“SYSTEMERROR”时,一定要使用原单号重试,否则可能造成重复支付等资金风险。
注意2-根据监管要求,新申请商户号使用企业付款需要满足两个条件:1、入驻时间超过90天 2、连续正常交易30天。
>关于证书的配置。
--------------------------------关于签名证书(c#)--------------------------
找到问题了
// X509Certificate cer = new X509Certificate(cert, password);//线下发布需要添加的
将上面的改成
X509Certificate2 cer = new X509Certificate2(cert, password, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);//线上发布需要添加
----------------------------关于签名证书(php)-----------------------
(引文:http://blog.csdn.net/weixin_29778143/article/details/54406369)
$ch = curl_init ();
$MENU_URL = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
curl_setopt ( $ch, CURLOPT_URL, $MENU_URL );
curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, "POST" );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, true );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, 2 );
$zs1 = getcwd()."/apiclient_cert.pem";
$zs2 = getcwd()."/apiclient_key.pem";
$zs3 = getcwd()."/rootca.pem";
curl_setopt ( $ch, CURLOPT_SSLCERT, $zs1 );
curl_setopt ( $ch, CURLOPT_SSLKEY, $zs2 );
curl_setopt ( $ch, CURLOPT_CAINFO, $zs3 );
// curl_setopt($ch, CURLOPT_USERAGENT, ‘Mozilla/5.0 (compatible; MSIE 5.01;
// Windows NT 5.0)‘);
curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, 1 );
curl_setopt ( $ch, CURLOPT_AUTOREFERER, 1 );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
$info = curl_exec ( $ch );
if (curl_errno ( $ch )) {
echo ‘Errno‘ . curl_error ( $ch );
}
curl_close ( $ch );
这是最后一步请求的时候$zs1 = getcwd()."/apiclient_cert.pem";
$zs2 = getcwd()."/apiclient_key.pem";这3个证书的路径必须加上getcwd()才能正确访问到,否则会访问不到路径
$zs3 = getcwd()."/rootca.pem";
---------另外一个示例
-------------------------包含注释的代码示例.
微信红包接口调试过程中一直提示“CA证书出错,请登陆微信支付商户平台下载证书”,经反复调试,大致解决方法如下:
1.首先确保CA证书的路径是否正确,一定得是绝对路径,因为是PHP开发的,这里需要三个pem证书
2.确保服务器支持,新浪云的sae,经测试支持不是很好,一直报错,换用其他服务器后,一次通过
POST红包证书的代码部分如下:
function post( $strXml) {
$url=‘https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack‘;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//因为微信红包在使用过程中需要验证服务器和域名,故需要设置下面两行
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 只信任CA颁布的证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 检查证书中是否设置域名,并且是否与提供的主机名匹配
curl_setopt($ch, CURLOPT_SSLCERT,‘/var/www/html/hongbao/apiclient_cert.pem‘);
curl_setopt($ch, CURLOPT_SSLKEY,‘/var/www/html/hongbao/apiclient_key.pem‘);
curl_setopt($ch, CURLOPT_CAINFO, ‘/var/www/html/hongbao/rootca.pem‘); // CA根证书(用来验证的网站证书是否是CA颁布)
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $strXml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$res = curl_exec($ch);
curl_close($ch);
return $res;
}
----------------------------------常见问题.
1、CA证书错误
在WxMchPay中大家可以看到,我重写了SDK中 Wxpay_client_pub 的 postXmlSSLCurl()方法
因为默认在SDK中的这个方法在CURL POST请求的时候没有附带CA证书。
相比之下就多了
curl_setopt($ch,CURLOPT_CAINFO, WxPayConf_pub::SSLROOTCA_PATH); 这么一行代码。
作用就是请求时附带CA证书。
2、对同一用户转账操作过于频繁,请稍候重试.
这个错误属于微信服务端的限制,具体限制频率也没有找到那里有说明,不过经过实际测试大概在1分钟左右。
所以在开发的时候还需要多注意。
>关于证书的一个调试记录.
1)提示"CA证书出错".
2)
路径写成绝对路径.
[ps]微信官方的sdk,如果提现失败,都统一报哪个签名错误,需要打日志分析.
------------------------------------关于微信支付中企业给用户付款.
http://www.boyihudong.net/2016/wxask_0511/95.html
-------------------------后来安排财务,往商户账户的储值上充值了10元. 就可以了
真正的成功:SUCCESS nonce_str partner_trade_no payment_no
{“return_code”:””,”return_msg”:””,”mchid”:””,”nonce_str”:””,”result_code”:””,”partner_trade_no”:””,”payment_no”:””,”payment_time”:”2017-12-04 17:35:12”}
提现接口的执行事务中,手续费计算出来后,也要给扣除掉...
事务里面,查询这条数据的时候,要锁定这user(含储值)的行. select .... from 表 for update .
常见问题
快速入门
无