微信企業號支付個人php實現
導語:分銷商,微商提現怎麼提?
直接用微信支付。
實現如下:
- 微信支付配置
/*微信支付*/
`PAY_WEIXIN` => array(
`appid` => `XXXX`,
`appsecret` => `XXXXXXX`,
`mchid` => `1283301801`, //商戶號
`key` => `zhudianbaodiandodozhudianbao0527`, //商戶支付祕鑰
`apiclient_cert` => `Conf/cert/apiclient_cert.pem`, //商戶證照apiclient_cert.pem
`apiclient_key` => `Conf/cert/apiclient_key.pem`, //商戶證照apiclient_key.pem
)
-
arrayToXml
/** * array轉xml */ function arrayToXml($arr) { $xml = "<xml>"; foreach ($arr as $key=>$val) { if (is_numeric($val)) { $xml.="<".$key.">".$val."</".$key.">"; } else $xml.="<".$key."><![CDATA[".$val."]]></".$key.">"; } $xml.="</xml>"; return $xml; }
-
使用證照,以post方式提交xml到對應的介面url
/**
* 作用:使用證照,以post方式提交xml到對應的介面url
*/
function postXmlSSLCurl($xml, $url, $second, $cert, $key)
{
$ch = curl_init();
//超時時間
curl_setopt($ch,CURLOPT_TIMEOUT,$second ? $second : $this->timeout);
//這裡設定代理,如果有的話
//curl_setopt($ch,CURLOPT_PROXY, `8.8.8.8`);
//curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
//設定header
curl_setopt($ch,CURLOPT_HEADER,FALSE);
//要求結果為字串且輸出到螢幕上
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
//設定證照
//使用證照:cert 與 key 分別屬於兩個.pem檔案
//預設格式為PEM,可以註釋
curl_setopt($ch,CURLOPT_SSLCERTTYPE,`PEM`);
curl_setopt($ch,CURLOPT_SSLCERT,$cert);
//預設格式為PEM,可以註釋
curl_setopt($ch,CURLOPT_SSLKEYTYPE,`PEM`);
curl_setopt($ch,CURLOPT_SSLKEY, $key);
//post提交方式
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
$data = curl_exec($ch);
//返回結果
if($data){
curl_close($ch);
return $this->xmlToArray($data);
}
else {
$error = curl_errno($ch);
echo "curl出錯,錯誤碼:$error"."<br>";
curl_close($ch);
return false;
}
}
- 企業向個人付款
//企業向個人付款
public function payToUser($params, $key, $apicent_cert, $apiclient_key) {
$url = `https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers`;
//檢測必填引數
if($params["partner_trade_no"] == null) { //
exit("退款申請介面中,缺少必填引數partner_trade_no!"."<br>");
}elseif($params["openid"] == null){
exit("退款申請介面中,缺少必填引數openid!"."<br>");
}elseif($params["check_name"] == null){ //NO_CHECK:不校驗真實姓名 FORCE_CHECK:強校驗真實姓名(未實名認證的使用者會校驗失敗,無法轉賬)OPTION_CHECK:針對已實名認證的使用者才校驗真實姓名(未實名認證使用者不校驗,可以轉賬成功)
exit("退款申請介面中,缺少必填引數check_name!"."<br>");
}elseif(($params["check_name"] == `FORCE_CHECK` or $params["check_name"] == `OPTION_CHECK`) && ($params["re_user_name"] == null)){ //收款使用者真實姓名。
exit("退款申請介面中,缺少必填引數re_user_name!"."<br>");
}elseif($params["amount"] == null){
exit("退款申請介面中,缺少必填引數amount!"."<br>");
}elseif($params["desc"] == null){
exit("退款申請介面中,缺少必填引數desc!"."<br>");
}
$params["mch_appid"] = $this->appid;//公眾賬號ID
$params["mchid"] = $this->mchid;//商戶號
$params["nonce_str"] = $this->createNoncestr();//隨機字串
$params[`spbill_create_ip`] = $_SERVER[`REMOTE_ADDR`] == `::1` ? `192.127.1.1` : $_SERVER[`REMOTE_ADDR`];//獲取IP
$params["sign"] = $this->getSign($params, $key);//簽名
$xml = $this->arrayToXml($params);
return $this->postXmlSSLCurl($xml, $url, false, $apicent_cert, $apiclient_key);
}
- 企業付款
private function _enterprisePay($number, $member_id, $amount, $desc)
{
// 獲取openid
$wxuser_id = M(`Member`)->where(array(`id` => $member_id))->getField(`wxuser_id`);
$openid = M(`Wxuser`)->where(array(`id` => $wxuser_id))->getField(`openid`);
$pay = C(`PAY_WEIXIN`);
import(`@.Action.WxDevelop`);
$enterprise = new WxEnterprise($pay[`appid`], $pay[`appsecret`], $pay[`mchid`]);
$params = array(
`partner_trade_no` => $number,
`openid` => $openid,
`check_name` => `NO_CHECK`,
`amount` => $amount, // 總計
`desc` => $desc,
);
$result = $enterprise->payToUser($params, $pay[`key`], $pay[`apiclient_cert`], $pay[`apiclient_key`]);
return $result;
}
- 處理分銷商提現
private function _handle($truename, $price) { // 處理分銷商提現
$withdrawid = date("ymdHis") . strval(rand(1000, 9999));
$data = array(`withdrawid` => $withdrawid, `store_id` => $this->store_id, `member_id` => $this->member_id, `truename` => $truename, `price` => $price, `addtime` => time());
//免稽核
if ($price >= C(`withdraw_uncheck_value`)) {
$data[`need_check`] = 0;
$data[`status`] = 1;
if ($this->withdrawModel->add($data)) {
$result = $this->_enterprisePay($withdrawid, $this->member_id, $price * 100, `分銷商(` . $truename . `)提現`);
//遇到支付資訊出錯,轉為需稽核提現
if ($result[`return_code`] != `SUCCESS`) {
$this->withdrawModel->where(array(`withdrawid` => $withdrawid))->save(array(`need_check` => 1, `status` => 0));
$this->assign(`success`, 2);
}
else {
//設定微信交易號
$this->withdrawModel->where(array(`withdrawid` => $withdrawid))->save(array(`payment_no` => $result[`payment_no`]));
//增加佣金流水,待修復
$data = array(`store_id` => $this->store_id, `user_type` => 2, `user_id` => $this->shop_id, `trade_type` => 2, `trade_no` => $withdrawid, `price` => -$price, `status`=> 1, `message` => $truename.`提現`, `addtime` => time());
M(`Twitter_log`)->add($data);
//減少相應可提佣金
M(`Member`)->where(array(`id` => $this->member_id))->setInc(`money`, -$price);
$this->assign(`success`, 1);
//傳送佣金變動訊息
import(`@.Action.Tmplmsg`);
$tmplmsg = new Tmplmsg();
$tmplmsg->send(Tmplmsg::PRICE_CHANGE, $this->member_id, array(`token` => $this->token, `intro` => `分銷佣金提現轉出`, `price` => $price, `business` => BUSINESS));
}
}
else {
$this->error(`提現資訊錯誤!`);
}
}
//需要稽核
else {
$this->withdrawModel->add($data);
$this->assign(`success` , 2);
}
}
提供企業向使用者付款的功能,支援企業通過API介面付款,或通過微信支付商戶平臺網頁功能操作付款。
溫馨提示:
◆ 給同一個實名使用者付款,單筆單日限額2W/2W
◆ 給同一個非實名使用者付款,單筆單日限額2000/2000
◆ 一個商戶同一日付款總額限額100W
◆ 僅支援商戶號已繫結的APPID;
◆ 針對付款的目標使用者,已微信支付實名認證的使用者可提供校驗真實姓名的功能,未實名認證的使用者無法校驗,企業可根據自身業務的安全級別選擇驗證型別;
◆ 付款金額必須小於或等於商戶當前可用餘額的金額;
◆ 已付款的記錄,企業可通過企業付款查詢檢視相應資料。
到賬
付款資金將進入目標使用者的零錢(微信-我-錢包-零錢)。微信支付將做零錢入賬訊息通知,零錢收支明細會展示相應記錄。
溫馨提示:
針對無零錢賬戶的歷史客戶端版本,資金將進入使用者的紅包賬戶,微信支付無訊息通知使用者,企業可選擇自行觸達使用者。
介面連結:https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers
是否需要證照
請求需要雙向證照。
資料示例:
<xml>
<mch_appid>wxe062425f740c30d8</mch_appid>
<mchid>10000098</mchid>
<nonce_str>3PG2J4ILTKCH16CQ2502SI8ZNMTM67VS</nonce_str>
<partner_trade_no>100000982014120919616</partner_trade_no>
<openid>ohO4Gt7wVPxIT1A9GjFaMYMiZY1s</openid>
<check_name>OPTION_CHECK</check_name>
<re_user_name>張三</re_user_name>
<amount>100</amount>
<desc>節日快樂!</desc>
<spbill_create_ip>10.2.3.10</spbill_create_ip>
<sign>C97BDBACF37622775366F38B629F45E3</sign>
</xml>
成功示例:
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[]]></return_msg>
<mch_appid><![CDATA[wxec38b8ff840bd989]]></mch_appid>
<mchid><![CDATA[10013274]]></mchid>
<device_info><![CDATA[]]></device_info>
<nonce_str><![CDATA[lxuDzMnRjpcXzxLx0q]]></nonce_str>
<result_code><![CDATA[SUCCESS]]></result_code>
<partner_trade_no><![CDATA[10013574201505191526582441]]></partner_trade_no>
<payment_no><![CDATA[1000018301201505190181489473]]></payment_no>
<payment_time><![CDATA[2015-05-19 15:26:59]]></payment_time>
</xml>
錯誤示例:
<xml>
<return_code><![CDATA[FAIL]]></return_code>
<return_msg><![CDATA[系統繁忙,請稍後再試.]]></return_msg>
<result_code><![CDATA[FAIL]]></result_code>
<err_code><![CDATA[SYSTEMERROR]]></err_code>
<err_code_des><![CDATA[系統繁忙,請稍後再試.]]></err_code_des>
</xml>
本文轉自TBHacker部落格園部落格,原文連結:http://www.cnblogs.com/jiqing9006/p/5231124.html,如需轉載請自行聯絡原作者
相關文章
- php實現微信企業號支付個人的方法詳解PHP
- PHP實現個人免簽約微信支付介面原理+原始碼PHP原始碼
- 一個PHP檔案搞定微信支付系列之企業付款PHP
- php微信支付介面開發的實現程式PHP
- Laravel+easywechat 實現公眾號微信支付Laravel
- 企業微信整合openai實現ChatGPT機器人OpenAIChatGPT機器人
- XorPay 個人支付平臺【支援個人微信支付和支付寶支付介面】
- PHP微信支付開發PHP
- PHP-Laravel支付寶支付和微信支付PHPLaravel
- 一個PHP檔案搞定微信支付系列之現金紅包PHP
- 個人微信和企業微信,哪個更適合管理客戶呢?
- 個人開發者福音,輕鬆接入個人簽約微信支付、支付寶支付妙招
- java實現掃碼槍-微信支付Java
- 微信sdk 公眾號 微信支付 NFC 坑&筆記筆記
- Python實現微信電腦版微信支付收款監聽及支付回撥通知Python
- 微信,支付寶小程式實現原理概述
- PHP微信支付統一下單PHP
- 微信公眾號支付踩坑記
- 微信支付,支付寶支付
- 微信支付 WEB APP 配置資訊流程(個人筆記)WebAPP筆記
- 微信企業付款介面PHP開發需要注意的兩個地方PHP
- 微信App支付:微信支付的appid,appsecret,商戶號mch_id,微信交易支付金鑰(mch_key)在哪裡檢視APP
- 微信支付:《2024國慶微信假期資料包告》微信支付的消費總筆數實現20%增長
- 企業微信JS-SDK實現會話聊天功能JS會話
- yearning訂閱webhook傳送到企業微信個人或群(思路)WebHook
- ASP.NET實現企業微信接入應用實現身份認證ASP.NET
- 微信小程式雲開發如何實現微信支付,業務邏輯又怎樣才算可靠微信小程式
- 實戰模擬│企業微信機器人實時報錯預警機器人
- 接入企業微信
- 微信支付WxpayAPI_php_v3 錯誤修改APIPHP
- PHP微信支付類V3介面PHP
- 企業微信商品圖冊-在企微裡開個小超市
- 微信公眾號支付開發手記(node)
- 支付寶、微信支付(.NET)
- pc企業微信hook介面,企業微信行銷軟體Hook
- 企業微信sdk呼叫,企業微信好友收發訊息
- php 微信機器人 Vbot 2.0PHP機器人
- 企業微信公眾號的運營策略有哪些?
- 微信小程式支付接入實戰微信小程式