微信支付企業付款到零錢功能應用廣泛,比如微信紅包獎勵,業務結算等,通過企業向個人付款,付款資金將直接進入用戶微信零錢,
一 開通條件

?
付款資金
企業付款到零錢資金使用商戶號余額資金,
根據商戶號的賬戶開通情況,實際出款賬戶有做區別:
◆ 默認情況下,企業付款到零錢使用商戶號基本戶(或余額賬戶)余額,如商戶號已開通運營賬戶,則企業付款到零錢使用運營賬戶內的資金,
◆ 基本戶(或上述其他出款賬戶)的資金來源,可能是交易結算款項(僅基本戶),或給賬戶充值的資金,當出款賬戶余額不足時,付款將因余額不足而付款失敗,
付款規則
付款方式
?◆ 支持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 = https://www.cnblogs.com/a609251438/p/$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 = https://www.cnblogs.com/a609251438/p/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 }
效果如下:

?

?
- 很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那里入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴展、高性能、高并發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家,需要的加群(點擊→)677079770
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/110767.html
標籤:PHP
