微信支付企業付款到零錢功能應用廣泛,比如微信紅包獎勵,業務結算等。通過企業向個人付款,付款資金將直接進入用戶微信零錢。 一 開通條件 付款資金 企業付款到零錢資金使用商戶號餘額資金。 根據商戶號的賬戶開通情況,實際出款賬戶有做區別: ◆ 預設情況下,企業付款到零錢使用商戶號基本戶(或餘額賬戶)餘 ...
微信支付企業付款到零錢功能應用廣泛,比如微信紅包獎勵,業務結算等。通過企業向個人付款,付款資金將直接進入用戶微信零錢。
一 開通條件
付款資金
企業付款到零錢資金使用商戶號餘額資金。
根據商戶號的賬戶開通情況,實際出款賬戶有做區別:
◆ 預設情況下,企業付款到零錢使用商戶號基本戶(或餘額賬戶)餘額。如商戶號已開通運營賬戶,則企業付款到零錢使用運營賬戶內的資金。
◆ 基本戶(或上述其他出款賬戶)的資金來源,可能是交易結算款項(僅基本戶),或給賬戶充值的資金。當出款賬戶餘額不足時,付款將因餘額不足而付款失敗。
付款規則
付款方式
◆ 支持API介面或網頁操作,付款至目標用戶。
收款用戶身份指定
◆ 通過APPID+OPENID指定收款用戶。
◆ APPID需要為申請商戶號時的APPID,或者與商戶號有綁定關係。
◆ OPENID的獲取方式,可參照:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839
付款額度
◆ 不支持給非實名用戶打款
◆ 給同一個實名用戶付款,單筆單日限額2W/2W
◆ 一個商戶同一日付款總額限額100W
註意:以上規則中的限額2w、100w由於計算規則與風控策略的關係,不是完全精確值,金額僅做參考,請不要依賴此金額做系統處理,應以介面實際返回和查詢結果為準,請知曉。
收款用戶身份校驗
◆ 針對付款的目標用戶,提供可校驗真實姓名的功能
查詢付款情況
◆ 已付款的記錄,企業可通過企業付款查詢查看相應數據,或者查詢商戶號資金流水。
付款頻次
◆ 預設每天最多可向同一個用戶付款10次,可以在商戶平臺--API安全進行設置
其他註意事項
◆ 付款金額必須小於或等於商戶當前可用餘額的金額;
二 介面地址
介面鏈接:https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers
請求參數:
具體參看官方企業付款開發文檔說明
1.基本配置
1 //公眾賬號appid 2 $data["mch_appid"] = 'appid'; 3 //商戶號 4 $data["mchid"] = ''; 5 //隨機字元串 6 $data["nonce_str"] = 'suiji'.mt_rand(100,999); 7 //商戶訂單號 8 $data["partner_trade_no"]=date('YmdHis').mt_rand(1000,9999); 9 //金額 用戶輸入的提現金額需要乘以100 10 $data["amount"] = $money; 11 //企業付款描述 12 $data["desc"] = '企業付款到個人零錢'; 13 //用戶openid 14 $data["openid"] = $openid; 15 //不檢驗用戶姓名 16 $data["check_name"] = 'NO_CHECK'; 17 //獲取IP 18 $data['spbill_create_ip']=$_SERVER['SERVER_ADDR']; 19 //商戶密鑰 20 $data['key']=''; 21 //商戶證書 商戶平臺的API安全證書下載 22 $data['apiclient_cert.pem'] 23 $data['apiclient_key.pem']
2.PHP代碼
1 /** 2 **開始支付 3 / 4 public function userpay(){ 5 $money = ‘用戶輸入提現金額'; 6 $info['money'] = ‘用戶餘額'; 7 if ($this->openid && $money){ 8 if ($money>$info['money'] ){ 9 echo json_encode([ 10 'status' => 1, 11 'message' => '餘額不足,不能提現!', 12 'code'=>'餘額不足,不能提現!' 13 ]); 14 }elseif ($money<1){ 15 echo json_encode([ 16 'status' => 2, 17 'message' => '提現金額不能小於1元', 18 'code'=>'提現金額太低' 19 ]); 20 }else{ 21 $openid = $this->openid; 22 $trade_no = date('YmdHis').mt_rand(1000,9999); 23 $res = $this->pay($openid,$trade_no,$money*100,'微信提現'); 24 25 //結果列印 26 if($res['result_code']=="SUCCESS"){ 27 28 echo json_encode([ 29 'status' => 3, 30 'message' => '提現成功!', 31 ]); 32 }elseif ($res['err_code']=="SENDNUM_LIMIT"){ 33 echo json_encode([ 34 'status' => 4, 35 'message' => '提現失敗!', 36 'code'=>'每日僅能提現一次', 37 ]); 38 }else{ 39 echo json_encode([ 40 'status' => 5, 41 'message' => '提現失敗!', 42 'code'=>$res['err_code'], 43 ]); 44 } 45 } 46 }else{ 47 echo json_encode([ 48 'status' => 5, 49 'message' => '未檢測到您當前微信賬號~', 50 51 ]); 52 } 53 }
支付方法
1 /** 2 *支付方法 3 / 4 public function pay($openid,$trade_no,$money,$desc){ 5 $params["mch_appid"]=''; 6 $params["mchid"] = ''; 7 $params["nonce_str"]= 'suiji'.mt_rand(100,999); 8 $params["partner_trade_no"] = $trade_no; 9 $params["amount"]= $money; 10 $params["desc"]= $desc; 11 $params["openid"]= $openid; 12 $params["check_name"]= 'NO_CHECK'; 13 $params['spbill_create_ip'] = $_SERVER['SERVER_ADDR']; 14 15 //生成簽名 16 $str = 'amount='.$params["amount"].'&check_name='.$params["check_name"].'&desc='.$params["desc"].'&mch_appid='.$params["mch_appid"].'&mchid='.$params["mchid"].'&nonce_str='.$params["nonce_str"].'&openid='.$params["openid"].'&partner_trade_no='.$params["partner_trade_no"].'&spbill_create_ip='.$params['spbill_create_ip'].'&key=商戶密鑰'; 17 18 //md5加密 轉換成大寫 19 $sign = strtoupper(md5($str)); 20 //生成簽名 21 $params['sign'] = $sign; 22 23 //構造XML數據 24 $xmldata = $this->array_to_xml($params); //數組轉XML 25 $url='https://api.mch.weixin.qq.com/mmpaymkttransfers/prom otion/transfers'; 26 27 //發送post請求 28 $res = $this->curl_post_ssl($url, $xmldata); //curl請求 29 if(!$res){ 30 return array('status'=>1, 31 'msg'=>"伺服器連接失敗" ); 32 } 33 34 //付款結果分析 35 $content = $this->xml_to_array($res); //xml轉數組 36 return $content; 37 }
curl請求
1 /** 2 * curl請求 3 / 4 public function curl_post_ssl($url, $xmldata, $second=30,$aHeader=array()){ 5 $ch = curl_init(); 6 //超時時間 7 curl_setopt($ch,CURLOPT_TIMEOUT,$second); 8 curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1); 9 //這裡設置代理,如果有的話 10 //curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98'); 11 //curl_setopt($ch,CURLOPT_PROXYPORT, 8080); 12 curl_setopt($ch,CURLOPT_URL,$url); 13 curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); 14 curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false); 15 16 //預設格式為PEM,可以註釋 17 curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM'); 18 //絕對地址可使用 dirname(__DIR__)列印,如果不是絕對地址會報 58 錯誤 19 curl_setopt($ch,CURLOPT_SSLCERT,' 絕對地址/apiclient_cert.pem'); 20 curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM'); 21 curl_setopt($ch,CURLOPT_SSLKEY,'絕對地址/apiclient_key.pem'); 22 if( count($aHeader) >= 1 ){ 23 curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader); 24 } 25 curl_setopt($ch,CURLOPT_POST, 1); 26 curl_setopt($ch,CURLOPT_POSTFIELDS,$xmldata); 27 $data = curl_exec($ch); 28 if($data){ 29 curl_close($ch); 30 return $data; 31 } 32 else { 33 $error = curl_errno($ch); 34 echo "call faild, errorCode:$error\n"; 35 die(); 36 curl_close($ch); 37 return false; 38 } 39 }
生成簽名
1 /** 2 * array 轉 xml 3 * 用於生成簽名 4 */ 5 public function array_to_xml($arr){ 6 $xml = "<xml>"; 7 foreach ($arr as $key => $val) { 8 if (is_numeric($val)) { 9 $xml .= "<" .$key.">".$val."</".$key.">"; 10 } else 11 $xml .= "<".$key."><![CDATA[".$val."]]></".$key.">"; 12 } 13 $xml .= "</xml>"; 14 return $xml; 15 } 16 17 /** 18 * xml 轉化為array 19 */ 20 public function xml_to_array($xml){ 21 //禁止引用外部xml實體 22 libxml_disable_entity_loader(true); 23 $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); 24 return $values; 25 }
效果如下: