Der Zweck des Schreibens dieses Artikels liegt hauptsächlich darin, dass das von der öffentlichen WeChat-Plattform bereitgestellte SDK keine SDK-Implementierung für diese Funktion bereitstellt
Tatsächlich ist es das Finale Die Implementierung wurde mit Hilfe der Entwicklungsdokumente und des SDK der WeChat Public-Plattform erreicht.
Anwendungsszenarien für Unternehmenszahlungen: Offizielle Konten leisten Zahlungen an verfolgte Benutzer, wie z. B. die Abwicklung von Rückerstattungen, Finanzabrechnungen usw.
Lass uns reden zur Implementierung zuerst Idee:
Erweitern Sie die WxMchPay-Komponente auf Basis der Klassenbibliothek , die im SDK enthalten ist, um die Erweiterung der Unternehmenszahlungsfunktionen zu realisieren.
Lassen Sie uns ohne weitere Umschweife über den Code sprechen. Das Folgende ist die Komponente, die das SDK erbt, um Unternehmenszahlungen zu implementieren:
$-Parameter Parameterreferenz: Enterprise Payment API Dokument
<?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; } } }
Controller-Layer-Funktionsimplementierung:
<?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()) ); } } }
Nachdem Sie die beiden oben genannten Codeteile abgeschlossen haben, können Sie die Enterprise Payment API grundsätzlich erfolgreich aufrufen.
Beispiel für die Datenstruktur der zurückgegebenen Ergebnisse:
{ "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" }
Mögliche Probleme:
1. CA-Zertifikatfehler
Wie Sie in WxMchPay sehen können, habe ich die postXmlSSLCurl()-Methode von Wxpay_client_pub im SDK neu geschrieben
Aus diesem Grund Die Methode im SDK wird standardmäßig nicht mit einem CA-Zertifikat geliefert, wenn eine CURL POST-Anfrage gestellt wird.
Viel im Vergleich
curl_setopt($ch,CURLOPT_CAINFO, WxPayConf_pub::SSLROOTCA_PATH); So eine Zeile von Code.
Die Funktion besteht darin, das CA-Zertifikat bei der Anfrage anzuhängen.
2. Übertragungsvorgänge an denselben Benutzer kommen zu häufig vor. Bitte versuchen Sie es später erneut.
Dieser Fehler gehört dazu zu WeChat Es gibt keine Erklärung zu den serverseitigen Einschränkungen und der spezifischen Frequenzbegrenzung, aber nach tatsächlichen Tests beträgt sie etwa 1 Minute.
Sie müssen also bei der Entwicklung mehr Aufmerksamkeit schenken.
[Verwandte Empfehlungen]
1. Quellcode der WeChat-Plattform herunterladen
Das obige ist der detaillierte Inhalt vonUnternehmenszahlung für die Entwicklung kleiner Programme. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!