重庆小潘seo博客

当前位置:首页 > 重庆网络营销 > 小潘杂谈 >

小潘杂谈

小程序开发之企业付款

时间:2020-09-17 02:00:06 作者:重庆seo小潘 来源:
写这篇文章的目的主要是由于在微信公众平台提供的SDK中并没有提供此功能的SDK实现, 其实最后实现还是借助 微信公众平台开发文档 和 SDK 。 企业付款的应用场景: 公众号向已关注用户付款,比如处理退款、财务结算等 先说一下实现思路: 在SDK中自带类库的基

写这篇文章的目的主要是由于在微信公众平台提供的SDK中并没有提供此功能的SDK实现,

其实最后实现还是借助 微信公众平台开发文档 和 SDK 。

企业付款的应用场景: 公众号向已关注用户付款,比如处理退款、财务结算等

先说一下实现思路:

在SDK中自带类库的基础上扩展WxMchPay组件, 实现企业付款功能的扩展。

话不多说,上代码, 下面是继承SDK,实现企业付款的组件:

$parameters参数参考: 企业付款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);//设置headercurl_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层功能实现:<?php/** * Author:Max.wen * DateTime: <15/9/20 16:47> */namespace HomeController;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、对同一用户转账操作过于频繁,请稍候重试.

  这个错误属于微信服务端的限制,具体限制频率也没有找到那里有说明,不过经过实际测试大概在1分钟左右。

  所以在开发的时候还需要多注意。

【相关推荐】

1. 微信公众号平台源码下载

2. 微信投票源码免费下载以上就是小程序开发之企业付款的详细内容,更多请关注小潘博客其它相关文章!