微信开发 -- 企业付款 PHP代码实现
来源:互联网 发布:php后端管理模板 编辑:程序博客网 时间:2024/06/11 08:35
写这篇文章的目的主要是由于在微信公众平台提供的SDK中并没有提供此功能的SDK实现,
其实最后实现还是借助 微信公众平台开发文档 和 SDK 。
企业付款的应用场景: 公众号向已关注用户付款,比如处理退款、财务结算等
先说一下实现思路:
在SDK中自带类库的基础上扩展WxMchPay组件, 实现企业付款功能的扩展。
话不多说,上代码, 下面是继承SDK,实现企业付款的组件:
$parameters参数参考: 企业付款API的文档
*/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".""; echo "错误原因查询"; curl_close($ch); return false; } }}
Controller层功能实现:
*/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、对同一用户转账操作过于频繁,请稍候重试.
这个错误属于微信服务端的限制,具体限制频率也没有找到那里有说明,不过经过实际测试大概在1分钟左右。
所以在开发的时候还需要多注意。
1 0
- 微信开发 -- 企业付款 PHP代码实现
- 微信开发 -- 企业付款 PHP代码实现
- 微信开发 -- 企业付款 PHP代码实现
- php微信企业付款
- php实现微信企业向用户付款
- 微信企业付款
- java开发微信公众号企业付款开发
- java开发微信公众号企业付款开发
- 11. PHP接入微信企业付款功能
- php微信企业付款到个人零钱
- 企业微信付款接口
- java微信企业付款
- 微信开发 现金红包、裂变红包、企业付款
- java实现微信企业付款到个人
- Dcloud中mui 微信支付接口完美实现付款代码(PHP微信支付demo)
- 微信企业付款接口API
- 微信企业付款接口二三事
- 【微信付款】企业支付个人api
- Java内存区域划分
- 人生经验 大学自动化专业学生关于全国计算机二,三,四等级考试方向的选择
- 布料模拟
- oracle分区的四种方式
- Jni接口-深入研究参数的传递
- 微信开发 -- 企业付款 PHP代码实现
- JHTP练习题及课题_第六章_深入理解方法 (附加一些感慨)
- 开源列表(一) Twitter开源软件列表
- 将train_val.prototxt 转换成deploy.prototxt
- Jenkins 中如何手工来添加插件呢
- 计算UDP校验
- AvtiveMQ入门教程
- Android Studio之初体验 ---- 很好很强大
- null与空串的区别,什么是空指针,如何解决空指针异常