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 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');
|
调用的话,稍微在修改下,加上自己的业务逻辑就行了。
四、调用效果
也可以下载文件,我写的是一个类文件:
PHP微信商户支付企业付款到零钱功能