tp5微信開發(五)--- tp5微信企業付款到零錢開發實踐
專案需求:客戶有一個分銷專案,需要對分享獲得的獎勵直接發放至客戶零錢錢包。
開發文件傳送門:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1
企業付款到使用者零錢開通條件:
1、商戶號(或同主體其他非服務商商戶號)已入駐90日
2、商戶號(或同主體其他非服務商商戶號)有30天連續正常交易
3、 登入微信支付商戶平臺-產品中心,開通企業付款。
企業付款資金來源:
◆ 預設情況下,企業付款到零錢使用商戶號基本戶(或餘額賬戶)餘額。如商戶號已開通運營賬戶,則企業付款到零錢使用運營賬戶內的資金。
◆ 基本戶(或上述其他出款賬戶)的資金來源,可能是交易結算款項(僅基本戶),或給賬戶充值的資金。當出款賬戶餘額不足時,付款將因餘額不足而付款失敗。
專案準備:分銷關係的建立不做說明,現在假設已建立上下級關係,下級支付後對使用者進行佣金獎勵。
程式碼實際上網上已經有很多版本demo,我選了一個並與其他版本進行比對,經過三個小時踩坑和各種除錯,總結了一個可執行版本。
程式碼:
-
public function sendMoney($amount,$re_openid,$desc='推薦獎勵',$check_name=''){
-
$total_amount = (100) * $amount;
-
$data=array(
-
'mch_appid'=> '',//商戶賬號appid
-
'mchid'=> '',//商戶號
-
'nonce_str'=> $this->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地址
-
);
-
$secrect_key = '';//API密碼
-
$data = array_filter($data);
-
ksort($data);
-
$str ='';
-
foreach($data as $k=>$v) {
-
$str.=$k.'='.$v.'&';
-
}
-
$str.='key='.$secrect_key;
-
$data['sign'] = md5($str);
-
$xml = $this->arraytoxml($data);
-
$url='https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; //呼叫介面
-
$res = $this->wx_curl($xml,$url);
-
$return = $this->xmltoarray($res);
-
$responseObj = simplexml_load_string($res, 'SimpleXMLElement', LIBXML_NOCDATA);
-
echo $res= $responseObj->return_code; //SUCCESS 如果返回來SUCCESS,則發生成功,處理自己的邏輯
-
return $res;
-
}
-
public function createNoncestr($length =32){
-
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
-
$str ="";
-
for ( $i = 0; $i < $length; $i++ ) {
-
$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
-
}
-
return $str;
-
}
-
public function arraytoxml($data){
-
$str='<xml>';
-
foreach($data as $k=>$v) {
-
$str.='<'.$k.'>'.$v.'</'.$k.'>';
-
}
-
$str.='</xml>';
-
return $str;
-
}
-
public 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;
-
}
-
public function wx_curl($vars,$url,$second = 30, $aHeader = array()) {
-
$isdir = ROOT_PATH."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, true);// 終止從服務端進行驗證
-
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');//證照位置
-
if (count($aHeader) >= 1) {
-
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);//設定頭部
-
}
-
curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
-
curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);//全部資料使用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;
-
}
-
}
測試方法:新建一個check方法,通過訪問域名/index/base/send_check 進行測試:
備註說明:第一個引數是付款金額,第二個引數是收款openid,這個我本身已經存的有所以直接從資料庫貼上過來的。
-
public function send_check(){
-
$this->sendMoney(1,'olrMRuIULa1k_GKC7XwLWPlH0IA8','哎咖啡付款到零錢測試');
-
}
劃重點:
1,付款到零錢需要用到證照,現在微信已經在推行新的api證照,新版證照生成說明傳送門:https://kf.qq.com/faq/180824BrQnQB180824m6v2yA.html 操作不難,按照指引,就兩個複製貼上的事,最終點選生成會自動下載一個證照壓縮包。
我們是php的,所以用得到下面兩個證照檔案,在tp5專案根目錄下建立 cert 資料夾,並上傳兩個證照檔案【我看有的網友總結說,證照必須要放到根目錄而且必須是cert命名,這個我沒有求證,不知道是否是強制要求,不過我是的確是這麼做的】。
2,在測試過程中,總會踩各種各樣的坑,我把我大概的除錯過程中遇到的錯誤進行說明:
1),列印curl 返回錯誤 int(58),查詢 curl 對應返回碼得知是證照問題,我能確定我證照是最新生成的,所以證照是沒問題,查文件要求證照檔案必須是絕對路徑,改之,成功。對於證照檔案路徑,可在curl請求中列印具體路徑值,確保是絕對路徑。
2),提示簽名錯誤,核驗方法:一再需要確認商戶號,appid以及支付祕鑰是否正確,我當時沒留意,就這個問題查了一個小時,結果發現是商戶號寫的是之前測試對應的賬戶,結果一直都驗籤不成功,WTF!
3),支付提示賬戶餘額不足,查客戶的基本賬戶,交易型別設定的是T+1的,可能是這個原因,導致商戶收到的錢都直接轉到客戶指定的銀行賬號了,點選交易中心->充值->選擇銀行,充值了測試金,返回繼續訪問路由,OK,成功。
最終效果:
轉載自:https://blog.csdn.net/qq_27987023/article/details/89810035
相關文章
- 微信開發系列----企業付款到銀行卡介面開發
- 關於微信支付V3 更新《企業打款到零錢》至《商戶轉賬到零錢》
- 微信零錢通怎麼開通?微信零錢通收益怎麼樣?
- 微信iOS收款到賬語音提醒開發總結iOS
- 【微信小程式開發】梔子手作花花微信小程式商城開發最佳實踐微信小程式
- 企業微信開發——身份驗證模組
- 企業微信sdk呼叫,企業微信好友收發訊息
- TP5自動生成APP和微信小程式APP微信小程式
- 微信開發-微信網頁開發-授權多次回撥網頁
- 使用 Mpvue 開發微信小程式的最佳實踐Vue微信小程式
- ionic4 開發企業微信應用0
- 微信開發之微信域名防封介面
- 微信開發1 (接入微信)
- 西安微信開發方案
- PHP微信支付開發PHP
- 微信小程式開發微信小程式
- 微信開發系列之一 - 微信公眾號開發的開發環境搭建開發環境
- 微信開發:清除微信瀏覽器快取瀏覽器快取
- 微信小遊戲和白鷺引擎開發實踐遊戲
- 企業微信自建應用開發-免密登入
- 微信後臺開發實戰教程
- 微信小程式開發常見問題(五)微信小程式
- tp5 + angularjs微信公眾號管理系統【6.18更新】AngularJS
- 微信零錢通提現到銀行卡要手續費嗎?微信零錢通怎麼開通?
- 微信公眾號開發5-自定義選單-微信開發phpPHP
- 微信公眾號開發
- 微信小程式開發2微信小程式
- angularjs + thinkphp + ionic微信開發AngularJSPHP
- 微信小程式開發教程微信小程式
- 初嘗微信小程式開發與實踐經驗分享微信小程式
- 使用 Taro 開發微信小程式的實踐 + 踩坑合集微信小程式
- 微信後臺開發作業講解
- 基於THINKPHP5 多微信開發框架,讓微信開發飛起來PHP框架
- 微信小程式開發新零售模式制度微信小程式模式
- [開源] 企業微信-會話內容存檔 實時拉取企業微信聊天記錄會話
- 雲原生微信小程式開發實戰微信小程式
- 微信小程式開發系列六:微信框架API的呼叫微信小程式框架API
- 企業微信如何管理微信客戶