本文將和大家介紹App微信支付(2016.10.11)的php(7.0)後台支付和回呼介面,框架是Thinkphp5.0:希望能幫助大家。
帳戶的各種參數
訂單資訊
請求prepay_id
*傳回APP資料處理
#微信回呼
修改訂單狀態
帳戶的各種參數
帳戶的各種參數就是像微信申請app支付的時候會給你的帳戶郵箱發郵件,裡面會有對應的微信支付分配的商家號碼(MCHID),APPID和APPSECRET是在申請app支付權限的時候返回的,還有KEY需要自己在用戶微信的商家後台裡面自己設定的,這個很重要!避免外洩!
#訂單資訊
**客戶端會把購物車裡面的商品數據傳到後台,還包括用戶的資訊等,拿到數據後首先需要驗證這些數據,這裡的驗證一般都會在專案初期就和客戶端定好傳輸規則,比如傳輸方式,參數名稱,驗證參數的方式,這裡的重點就是驗證,一般都會採用簽名認證的方式:
//簽名步驟一:依字典序排序參數;
這裡給出(格式化參數格式化成url參數)程式碼實例:
/** * 格式化参数格式化成url参数 */ public function ToUrlParams() { $buff = ""; foreach ($this->values as $k => $v) { if($k != "sign" && $v != "" && !is_array($v)){ $buff .= $k . "=" . $v . "&"; } } $buff = trim($buff, "&"); return $buff; }
//簽名步驟二:在string後加入KEY(這個KEY與前端人員協商而定);
//簽章步驟三:MD5加密;
//簽名步驟四:所有字元轉為大寫
這些最好在專案初期就封裝好,後期會只要調用就好,例:
(後期只需要, $param = $this->request('參數名稱'));即可), 然後將訂單資訊預先儲存.
請求prepay_id
這裡我就直接上程式碼吧,(這裡給出接口文檔下載地址:),雖然網上也有很多自己寫請求接口,但是既然微信已經封裝好了,用就行了:
$input = new \app\wxpay\WxPayUnifiedOrder();//这里引用微信的统一下单接口 $input->SetBody($data['gname']['g_name']);//商品或支付单简要描述 $input->SetAttach($data['gname']['g_name']);//置附加数据 $input->SetOut_trade_no($order_sn); // 商户订单号 $input->SetTotal_fee(intval($data['data']['order_price']*100)); $input->SetTime_start(date("YmdHis"));//订单生成时间 $input->SetTime_expire(date("YmdHis", time() + 600));//订单失效时间 $input->SetGoods_tag($data['gname']['g_name']); //商品标记 $input->SetNotify_url("http://www.weixin.qq.com/wxpay/notify.php"); // 支付成功后的回调地址, $input->SetTrade_type("APP"); $order = \app\wxpay\WxPayApi::unifiedOrder($input);return $order['prepay_id'];
這裡給予微信官方統一下單一介面說明位址:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
$info = array(); //账号的信息一般都放在配置文件里面,用到的地方也很多 $info['appid'] = config('APP_APPID'); $info['partnerid'] = config('APP_MCHID'); $info['package'] = config('APP_PACKAGE'); $info['noncestr'] = $this->random_number();//生成随机数,下面有生成实例,统一下单接口需要 $info['timestamp'] = time(); $info['prepayid'] = $prepay_id; $info['sign'] = self::_makeSign($info);//生成签名return $info;$info就是客戶端需要的資訊啦
產生隨機數字實例
//生成随机数 public function random_number($len=21,$format='ALL' ){ $is_abc = $is_numer = 0; $password = $tmp =''; switch($format){ case 'ALL': $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; break; case 'CHAR': $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; break; case 'NUMBER': $chars='0123456789'; break; default : $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; break; } // www.jb51.net mt_srand((double)microtime()*1000000*getmypid()); while(strlen($password)<$len){ $tmp =substr($chars,(mt_rand()%strlen($chars)),1); if(($is_numer <> 1 && is_numeric($tmp) && $tmp >0 )|| $format == 'CHAR'){ $is_numer = 1; } if(($is_abc <> 1 && preg_match('/[a-zA-Z]/',$tmp)) || $format == 'NUMBER'){ $is_abc = 1; } $password.= $tmp; } if($is_numer <> 1 || $is_abc <> 1 || empty($password) ){ $password = $this->random_number($len,$format); } return $password; }
微信回呼
支付結果通知notify.php(這裡的位址就是統一下單時填寫的回呼位址,微信已經封裝好),文件下載位址
http://mch.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1其實這個頁面最主要的程式碼就兩行
[php] view plain copy
$notify = new PayNotifyCallBack(); $notify->Handle(false);
其中大部分邏輯在Handle 函數中處理檔案WxPay.Notify.php
[php] view plain copy
final public function Handle($needSign = true) { $msg = "OK"; //当返回false的时候,表示notify中调用NotifyCallBack回调失败获取签名校验失败,此时直接回复失败 $result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg); if($result == false){ $this->SetReturn_code("FAIL"); $this->SetReturn_msg($msg); $this->ReplyNotify(false); return; } else { //该分支在成功回调到NotifyCallBack方法,处理完成之后流程 $this->SetReturn_code("SUCCESS"); $this->SetReturn_msg("OK"); } $this->ReplyNotify($needSign); }
主要程式碼:
[php] view plain copy$result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg);追蹤函數notify 檔案WxPay.Api.php#[ php] view plain copy
public static function notify($callback, &$msg) { //获取通知的数据 $xml = $GLOBALS['HTTP_RAW_POST_DATA']; //如果返回成功则验证签名 try { $result = WxPayResults::Init($xml); } catch (WxPayException $e){ $msg = $e->errorMessage(); return false; } return call_user_func($callback, $result); }透過$GLOBALS['HTTP_RAW_POST_DATA']; 取得同志資料然後Init 函式驗證簽章等。驗簽成功運行代碼.
這裡需要說明,php7本身不支援$GLOBALS['HTTP_RAW_POST_DATA'],需要下載一個插件,具體什麼可自行百度,我想說的是可以用file_get_contents('php:/ /input'),具體原因可參考下面的部落格,寫的很詳細(https://my.oschina.net/jiec/blog/485359)
[php] view plain copy
return call_user_func($callback, $result);
即呼叫了一個回調函數,NotifyCallBack() 函數並傳遞參數$result 在NotifyCallBack函數中會呼叫我們重寫的NotifyProcess()函數(此函數在notify.php 中被重寫)
NotifyProcess( ) 判斷也沒有問題就會設定回傳success的xml訊息
###[php] view plain copy###$this->SetReturn_code("SUCCESS"); $this->SetReturn_msg("OK");###並最終呼叫函數 this−>ReplyNotify(this−>ReplyNotify(needSign) ; echo success的結果######函數ReplyNotify 需要修改一處程式碼:######[php] view plain copy###
final private function ReplyNotify($needSign = true) { //如果需要签名 if($needSign == true && $this->GetReturn_code($return_code) == "SUCCESS") { $this->SetSign(); } WxpayApi::replyNotify($this->ToXml()); }###[php] view plain copy###
$this->GetReturn_code($return_code) == "SUCCESS")## #改為######[php] view plain copy###
$this->GetReturn_code() == "SUCCESS")###即可。 php裡面新建了一個方法###
//修改订单状态 public function updateState($data){ if($data){ $order_sn = $data['out_trade_no'];\ $data = array(); $data['order_id'] = $order_id; //修改订单状态(用curlpost方法请求至thinkphp目录下的Controller里面控制器里面的方法,修改状态) $url = 'www.test.com'; header('content-type:text/html;charset=utf8'); $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); $result = curl_exec($curl); curl_close($curl); if($result == 'success'){ return true; }else{ return false; } } }###然後在notify.php 的###
$notify = new PayNotifyCallBack(); $notify->Handle(false);###下面加上###
//接受参数,修改状态 $xml = file_get_contents("php://input"); $data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); $notify->updateState($data);
相关推荐:
以上是App微信支付之php後台介面詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

在PHP中,trait適用於需要方法復用但不適合使用繼承的情況。 1)trait允許在類中復用方法,避免多重繼承複雜性。 2)使用trait時需注意方法衝突,可通過insteadof和as關鍵字解決。 3)應避免過度使用trait,保持其單一職責,以優化性能和提高代碼可維護性。

依賴注入容器(DIC)是一種管理和提供對象依賴關係的工具,用於PHP項目中。 DIC的主要好處包括:1.解耦,使組件獨立,代碼易維護和測試;2.靈活性,易替換或修改依賴關係;3.可測試性,方便注入mock對象進行單元測試。

SplFixedArray在PHP中是一種固定大小的數組,適用於需要高性能和低內存使用量的場景。 1)它在創建時需指定大小,避免動態調整帶來的開銷。 2)基於C語言數組,直接操作內存,訪問速度快。 3)適合大規模數據處理和內存敏感環境,但需謹慎使用,因其大小固定。

PHP通過$\_FILES變量處理文件上傳,確保安全性的方法包括:1.檢查上傳錯誤,2.驗證文件類型和大小,3.防止文件覆蓋,4.移動文件到永久存儲位置。

JavaScript中處理空值可以使用NullCoalescingOperator(??)和NullCoalescingAssignmentOperator(??=)。 1.??返回第一個非null或非undefined的操作數。 2.??=將變量賦值為右操作數的值,但前提是該變量為null或undefined。這些操作符簡化了代碼邏輯,提高了可讀性和性能。

CSP重要因為它能防範XSS攻擊和限制資源加載,提升網站安全性。 1.CSP是HTTP響應頭的一部分,通過嚴格策略限制惡意行為。 2.基本用法是只允許從同源加載資源。 3.高級用法可設置更細粒度的策略,如允許特定域名加載腳本和样式。 4.使用Content-Security-Policy-Report-Only頭部可調試和優化CSP策略。

HTTP請求方法包括GET、POST、PUT和DELETE,分別用於獲取、提交、更新和刪除資源。 1.GET方法用於獲取資源,適用於讀取操作。 2.POST方法用於提交數據,常用於創建新資源。 3.PUT方法用於更新資源,適用於完整更新。 4.DELETE方法用於刪除資源,適用於刪除操作。

HTTPS是一種在HTTP基礎上增加安全層的協議,主要通過加密數據保護用戶隱私和數據安全。其工作原理包括TLS握手、證書驗證和加密通信。實現HTTPS時需注意證書管理、性能影響和混合內容問題。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

Dreamweaver Mac版
視覺化網頁開發工具

禪工作室 13.0.1
強大的PHP整合開發環境

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3漢化版
中文版,非常好用