이 글을 쓰는 목적은 주로 WeChat 공개 플랫폼에서 제공하는 SDK가 이 기능에 대한 SDK 구현을 제공하지 않기 때문입니다.
사실 최종 WeChat Public 플랫폼 개발 문서와 SDK의 도움으로 구현이 이루어졌습니다.
기업 결제 적용 시나리오: 공식 계정은 환불 처리, 금전적 결제 등 팔로우하는 사용자에게 결제를 수행합니다.
이야기하자 구현에 대한 첫 번째 아이디어:
SDK에 포함된 클래스 라이브러리를 기반으로 WxMchPay 구성 요소를 확장하여 기업 결제 기능 확장을 실현합니다.
더 이상 고민하지 않고 코드에 대해 이야기해 보겠습니다. 다음은 이 SDK를 상속하여 기업 결제를 구현하는 구성 요소입니다.
$ 매개변수 매개변수 참조: Enterprise Payment 문서 API
<?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; } } }
컨트롤러 계층 기능 구현:
<?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()) ); } } }
위의 두 부분 코드를 완성하면 기본적으로 기업 결제 API를 성공적으로 호출할 수 있습니다.
결과를 반환하는 데이터 구조의 예:
{ "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" }
가능한 문제:
1. CA 인증서 오류
WxMchPay에서 볼 수 있듯이 SDK
에서 Wxpay_client_pub의 postXmlSSLCurl() 메서드를 다시 작성했습니다. SDK의 이 메서드는 CURL POST 요청을 생성할 때 CA 인증서를 포함하지 않습니다.
비교해 보면 많습니다
curl_setopt($ch,CURLOPT_CAINFO, WxPayConf_pub::SSLROOTCA_PATH); 암호.
요청 시 CA 인증서를 첨부하는 기능입니다.
2. 동일 사용자에게 전송 작업이 너무 잦습니다. 나중에 다시 시도하세요.
이 오류는 다음과 같습니다. WeChat에 서버 측 제한 사항 및 구체적인 빈도 제한에 대한 설명은 없지만 실제 테스트 후 약 1분 정도입니다.
그래서 개발할 때 더욱 주의를 기울여야 합니다.
[관련 추천]
위 내용은 소규모 프로그램 개발을 위한 기업 지불의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!