PHP实现微信商户支付企业付款到零钱功能 教程

  • 时间:2018-11-27 10:46 编辑:王大磊 来源:www.yuanmajia.com 阅读:1497
  • 扫一扫,手机访问
摘要:PHP实现微信商户支付企业付款到零钱功能 教程

一、开通条件

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

使用条件

  • 商户号(或同主体其他非服务商商户号)已入驻90日

  • 商户号(或同主体其他非服务商商户号)有30天连续正常交易

  • 登录微信支付商户平台-产品中心,开通企业付款。

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

二、代码展示

?

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
//企业付款到微信零钱,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);
   
  $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');

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

四、调用效果


  • 全部评论(0)
上一篇:已是第一篇内容
下一篇:phpstudy2018升级MySQL5.5为5.7(图文)教程
资讯详情页最新发布上方横幅
最新发布的资讯信息
【网站运营|】聚合支付平台的建设与搭建(2019-05-28 15:29)
【数据库|Mysql】多多客发布 3.0.0-alpha.3开源版,支持微信、百度、支付宝小程序(2019-03-22 09:48)
【网站运营|网络赚钱】创客系统开发(创客零售系统开发)(2019-03-22 09:29)
【网站运营|网络赚钱】互联网广告模式你知道多少(2018-11-28 19:21)
【网站运营|网络赚钱】短视频如何赚钱 短视频自媒体实操经验分享+真实(2018-11-28 19:17)
【源码编程|PHP编程】PHP实现微信商户支付企业付款到零钱功能 教程(2018-11-27 10:46)
【源码编程|PHP编程】phpstudy2018升级MySQL5.5为5.7(图文)教程(2018-11-27 10:43)
【数据库|Mysql】Windows mysql 8.0.12安装配置方法图文教程(2018-11-27 10:41)
【数据库|Mysql】mysql 解压版通过历史data目录恢复数据的教程图解(2018-11-27 10:39)
【网站运营|建站经验】新手开发网站 注意事项(2018-11-27 10:36)
联系我们
Q Q:40020598
邮箱:40020598@qq.com
时间:09:00 - 19:00
联系客服
客服① 客服② 售后 投诉 联系客服
400 20598
手机版

扫一扫进手机版
返回顶部