PHP微信商户支付企业付款到零钱功能(完)

微信支付开发文档

一、开通条件

企业付款为企业提供付款至用户零钱的能力,支持通过API接口付款,或通过微信支付商户平台(pay.weixin.qq.com)网页操作付款。

使用条件

  • 商户号(或同主体其他非服务商商户号)已入驻90日
  • 商户号(或同主体其他非服务商商户号)有30天连续正常交易
  • 登录微信支付商户平台-产品中心,开通企业付款。

1

具体的可以看微信支付开发文档

二、代码展示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170

//企业付款到微信零钱,PHP接口调用方法
define("APPID", "wxe062425f740c30d8"); // 商户账号appid
define("MCHID", "10000098");      // 商户号
define("SECRECT_KEY", "453436425252");  //支付密钥签名
define("IP", "xxx.xxx.xx.xx");   //IP


  /**
   * [xmltoarray xml格式转换为数组]
   * @param  [type] $xml [xml]
   * @return [type]      [xml 转化为array]
   */
  function xmltoarray($xml) { 
       //禁止引用外部xml实体 
      libxml_disable_entity_loader(true); 
      $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); 
      $val = json_decode(json_encode($xmlstring),true); 
      return $val;
  }

  /**
   * [arraytoxml 将数组转换成xml格式(简单方法):]
   * @param  [type] $data [数组]
   * @return [type]       [array 转 xml]
   */
  function arraytoxml($data){
      $str='<xml>';
      foreach($data as $k=>$v) {
          $str.='<'.$k.'>'.$v.'</'.$k.'>';
      }
      $str.='</xml>';
      return $str;
  }

  /**
   * [createNoncestr 生成随机字符串]
   * @param  integer $length [长度]
   * @return [type]          [字母大小写加数字]
   */
  function createNoncestr($length =32){
      $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyz0123456789";  
      $str ="";

      for($i=0;$i<$length;$i++){  
          $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);   
      }  
      return $str;
  }

  /**
   * [curl_post_ssl 发送curl_post数据]
   * @param  [type]  $url     [发送地址]
   * @param  [type]  $xmldata [发送文件格式]
   * @param  [type]  $second [设置执行最长秒数]
   * @param  [type]  $aHeader [设置头部]
   * @return [type]           [description]
   */
  function curl_post_ssl($url, $xmldata, $second = 30, $aHeader = array()){
      $isdir = $_SERVER['DOCUMENT_ROOT']."/cert/";//证书位置;绝对路径

      $ch = curl_init();//初始化curl

      curl_setopt($ch, CURLOPT_TIMEOUT, $second);//设置执行最长秒数
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
      curl_setopt($ch, CURLOPT_URL, $url);//抓取指定网页
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// 终止从服务端进行验证
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//
      curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');//证书类型
      curl_setopt($ch, CURLOPT_SSLCERT, $isdir . 'apiclient_cert.pem');//证书位置
      curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');//CURLOPT_SSLKEY中规定的私钥的加密类型
      curl_setopt($ch, CURLOPT_SSLKEY, $isdir . 'apiclient_key.pem');//证书位置
      curl_setopt($ch, CURLOPT_CAINFO, 'PEM');
      curl_setopt($ch, CURLOPT_CAINFO, $isdir . 'rootca.pem');
      if (count($aHeader) >= 1) {
          curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);//设置头部
      }
      curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
      curl_setopt($ch, CURLOPT_POSTFIELDS, $xmldata);//全部数据使用HTTP协议中的"POST"操作来发送

      $data = curl_exec($ch);//执行回话
      if ($data) {
          curl_close($ch);
          return $data;
      } else {
          $error = curl_errno($ch);
          echo "call faild, errorCode:$error\n";
          curl_close($ch);
          return false;
      }
  }


  /**
   * [sendMoney 企业付款到零钱]
   * @param  [type] $amount     [发送的金额(分)目前发送金额不能少于1元]
   * @param  [type] $re_openid  [发送人的 openid]
   * @param  string $desc       [企业付款描述信息 (必填)]
   * @param  string $check_name [收款用户姓名 (选填)]
   * @return [type]             [description]
   */
  function sendMoney($amount,$re_openid,$desc='测试',$check_name=''){
      
      $total_amount = (100) * $amount;
      
      $data=array(
          'mch_appid'=>APPID,//商户账号appid
          'mchid'=> MCHID,//商户号
          'nonce_str'=>createNoncestr(),//随机字符串
          'partner_trade_no'=> date('YmdHis').rand(1000, 9999),//商户订单号
          'openid'=> $re_openid,//用户openid
          'check_name'=>'NO_CHECK',//校验用户姓名选项,
          're_user_name'=> $check_name,//收款用户姓名
          'amount'=>$total_amount,//金额
          'desc'=> $desc,//企业付款描述信息
          'spbill_create_ip'=> IP,//Ip地址
      );

      //生成签名算法
      $secrect_key=SECRECT_KEY;///这个就是个API密码。MD5 32位。
      $data=array_filter($data);
      ksort($data);
      $str='';
      foreach($data as $k=>$v) {
         $str.=$k.'='.$v.'&';
      }
      $str.='key='.$secrect_key;
      $data['sign']=md5($str);
      //生成签名算法


      $xml=arraytoxml($data);
    
      $url='https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; //调用接口
      $res=curl_post_ssl($url,$xml);
      $return=xmltoarray($res);
      
   
      print_r($return);
      //返回来的结果是xml,最后转换成数组
    /*
    array(9) {
      ["return_code"]=>
      string(7) "SUCCESS"
      ["return_msg"]=>
      array(0) {
      }
      ["mch_appid"]=>
      string(18) "wx57676786465544b2a5"
      ["mchid"]=>
      string(10) "143345612"
      ["nonce_str"]=>
      string(32) "iw6TtHdOySMAfS81qcnqXojwUMn8l8mY"
      ["result_code"]=>
      string(7) "SUCCESS"
      ["partner_trade_no"]=>
      string(18) "201807011410504098"
      ["payment_no"]=>
      string(28) "1000018301201807019357038738"
      ["payment_time"]=>
      string(19) "2018-07-01 14:56:35"
    }
    */

      
      $responseObj = simplexml_load_string($res, 'SimpleXMLElement', LIBXML_NOCDATA);
      echo $res= $responseObj->return_code;  //SUCCESS  如果返回来SUCCESS,则发生成功,处理自己的逻辑
      
      return $res;
  }

三、调用方法

1
sendMoney(1,'gdgfdg56456223423','xxxx测试','xxx');

调用的话,稍微在修改下,加上自己的业务逻辑就行了。

四、调用效果

2

3

也可以下载文件,我写的是一个类文件:
PHP微信商户支付企业付款到零钱功能

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值