Le but de la rédaction de cet article est principalement dû au fait que le SDK fourni par la plateforme publique WeChat ne fournit pas d'implémentation de SDK pour cette fonction
En fait, le final. la mise en œuvre a été réalisée à l’aide des documents de développement de la plateforme publique WeChat et du SDK.
Scénarios d'application pour les paiements d'entreprise : les comptes officiels effectuent des paiements aux utilisateurs suivis, tels que le traitement des remboursements, les règlements financiers, etc.
Parlons-en à propos de la première idée de mise en œuvre :
Développez le composant WxMchPay sur la base de la bibliothèque de classes fournie dans le SDK pour réaliser l'expansion des fonctions de paiement d'entreprise.
Sans plus tarder, parlons du code. Voici le composant qui hérite du SDK pour implémenter le paiement d'entreprise :
Référence du paramètre des paramètres $ : Paiement d'entreprise APIdocument
<?php// 引入SDKimport('Common.Util.WxPay');/** * 微信企业付款操作类 * Author : Max.wen * DateTime: <15/9/16 11:00> */class WxMchPay extends Wxpay_client_pub { /** * API 参数 * @var array * 'mch_appid' # 公众号APPID * 'mchid' # 商户号 * 'device_info' # 设备号 * 'nonce_str' # 随机字符串 * 'partner_trade_no' # 商户订单号 * 'openid' # 收款用户openid * 'check_name' # 校验用户姓名选项 针对实名认证的用户 * 're_user_name' # 收款用户姓名 * 'amount' # 付款金额 * 'desc' # 企业付款描述信息 * 'spbill_create_ip' # Ip地址 * 'sign' # 签名 */ public $parameters = []; public function construct() { $this->url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; $this->curl_timeout = WxPayConf_pub::CURL_TIMEOUT; } /** * 生成请求xml数据 * @return string */ public function createXml() { $this->parameters['mch_appid'] = WxPayConf_pub::APPID; $this->parameters['mchid'] = WxPayConf_pub::MCHID; $this->parameters['nonce_str'] = $this->createNoncestr(); $this->parameters['sign'] = $this->getSign($this->parameters); return $this->arrayToXml($this->parameters); } /** * 作用:使用证书,以post方式提交xml到对应的接口url */ function postXmlSSLCurl($xml,$url,$second=30) { $ch = curl_init(); //超时时间 curl_setopt($ch,CURLOPT_TIMEOUT,$second); //这里设置代理,如果有的话 //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8'); //curl_setopt($ch,CURLOPT_PROXYPORT, 8080); curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE); //设置header curl_setopt($ch,CURLOPT_HEADER,FALSE); //要求结果为字符串且输出到屏幕上 curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE); //设置证书 curl_setopt($ch,CURLOPT_CAINFO, WxPayConf_pub::SSLROOTCA_PATH); //使用证书:cert 与 key 分别属于两个.pem文件 //默认格式为PEM,可以注释 curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM'); curl_setopt($ch,CURLOPT_SSLCERT, WxPayConf_pub::SSLCERT_PATH); //默认格式为PEM,可以注释 curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM'); curl_setopt($ch,CURLOPT_SSLKEY, WxPayConf_pub::SSLKEY_PATH); //post提交方式 curl_setopt($ch,CURLOPT_POST, true); curl_setopt($ch,CURLOPT_POSTFIELDS,$xml); $data = curl_exec($ch); //返回结果 if($data){ curl_close($ch); return $data; } else { $error = curl_errno($ch); echo "curl出错,错误码:$error"."<br>"; echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>错误原因查询</a></br>"; curl_close($ch); return false; } } }
Implémentation de la fonction de la couche contrôleur :
<?php/** * Author : Max.wen * DateTime: <15/9/20 16:47> */namespace Home\Controller;class TestController extends CommonController { /** * 企业付款测试 */ public function rebate() { import('Common.Util.WxMchPay'); $mchPay = new \WxMchPay(); // 用户openid $mchPay->setParameter('openid', 'oy2lbszXkgvlEKThrzqEziKEBzqU'); // 商户订单号 $mchPay->setParameter('partner_trade_no', 'test-'.time()); // 校验用户姓名选项 $mchPay->setParameter('check_name', 'NO_CHECK'); // 企业付款金额 单位为分 $mchPay->setParameter('amount', 100); // 企业付款描述信息 $mchPay->setParameter('desc', '开发测试'); // 调用接口的机器IP地址 自定义 $mchPay->setParameter('spbill_create_ip', '127.0.0.1'); # getClientIp() // 收款用户姓名 // $mchPay->setParameter('re_user_name', 'Max wen'); // 设备信息 // $mchPay->setParameter('device_info', 'dev_server'); $response = $mchPay->postXmlSSL(); if( !empty($response) ) { $data = simplexml_load_string($response, null, LIBXML_NOCDATA); echo json_encode($data); }else{ echo json_encode( array('return_code' => 'FAIL', 'return_msg' => 'transfers_接口出错', 'return_ext' => array()) ); } } }
Après avoir terminé les deux parties de code ci-dessus, vous pouvez appeler l'API de paiement d'entreprise avec succès.
Exemple de structure de données des résultats renvoyés :
{ "return_code": "SUCCESS", "return_msg": { }, "mch_appid": "wx519cae424099ed6b", "mchid": "1228636402", "device_info": { }, "nonce_str": "qjupk84q4iqxkb578hb5h2qiatgcwxwg", "result_code": "SUCCESS", "partner_trade_no": "test-1442801966", "payment_no": "1000018301201509210739170397", "payment_time": "2015-09-21 10:19:26" }
Problèmes possibles :
1. Erreur de certificat CA
Comme vous pouvez le voir dans WxMchPay, j'ai réécrit la méthode postXmlSSLCurl() de Wxpay_client_pub dans le SDK
Parce que cela par défaut, la méthode du SDK n'est pas accompagnée d'un certificat CA lors d'une requête CURL POST .
Beaucoup en comparaison
curl_setopt($ch,CURLOPT_CAINFO, WxPayConf_pub::SSLROOTCA_PATH); Une telle ligne de code.
La fonction est de joindre le certificat CA lors de la demande.
2. Les opérations de transfert vers le même utilisateur sont trop fréquentes, veuillez réessayer plus tard.
Cette erreur appartient à WeChat Il n'y a aucune explication sur les restrictions côté serveur et la limite de fréquence spécifique, mais après des tests réels, c'est environ 1 minute.
Vous devez donc accorder plus d'attention lors du développement.
[Recommandations associées]
1 Téléchargement du code source de la plateforme de compte public WeChat
2. Code source de vote WeChat gratuit. télécharger
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!