本文目錄一覽:
微信的jsapi支付能整合到thinkphp嗎
在demo文件夾中:
js_api_call.php:提供了微信jsapi的主要功能
log_.php:提供列印日誌功能
notify_url.php:非同步通知功能
notify_url.log:非同步通知日誌
qrcode.js:生成二維碼js插件
接下來介紹下WxPayPubHelper文件夾下的文件:
cacert 文件夾是存放微信證書的(PS:具體我還沒怎麼用證書,雖然下載下來了,證書請在微信商戶平台上下載)
SDKRuntimeException.php:這個就是處理異常的、
WxPay.pub.config.php:這個是做一些配置的,稍後會詳細講解
WxPayPubHelper.php:這個其實就是微信支付的工具類,對於初學者只要知道怎麼用他裡面的方法就夠了
OK,了解了微信官方提供的文件,我們就可以開始整合到TP中了,廢話不多說,這就開始!
step1:將demo中的WxPayPubHelper整個文件夾都複製到TP的Vendor目錄下,像我這樣:
step2:配置WxPay.pub.config.php文件:
這裡的配置都有注釋,如果還有不懂或者配置出現問題可以留言提問
同時我把微信的這個配置放到了TP的config中,這一步大家可以隨意
?php
return array(
//’配置項’=’配置值’
define(‘WEB_HOST’, ‘這是您的網站域名地址’),
/*微信支付配置*/
‘WxPayConf_pub’=array(
‘APPID’ = ‘您的APPID’,
‘MCHID’ = ‘您的商戶ID’,
‘KEY’ = ‘商戶秘鑰’,
‘APPSECRET’ = ‘您的APPSECRET’,
‘JS_API_CALL_URL’ = WEB_HOST.’/index.php/Home/WxJsAPI/jsApiCall’,
‘SSLCERT_PATH’ = WEB_HOST.’/ThinkPHP/Library/Vendor/WxPayPubHelper/cacert/apiclient_cert.pem’,
‘SSLKEY_PATH’ = WEB_HOST.’/ThinkPHP/Library/Vendor/WxPayPubHelper/cacert/apiclient_key.pem’,
‘NOTIFY_URL’ = WEB_HOST.’/index.php/Home/WxJsAPI/notify’,
‘CURL_TIMEOUT’ = 30
)
);
複製代碼
step3:將生成二維碼的js放在Public目錄下(這裡目前用不到,在用掃碼支付的情況才用到這個js),將日誌文件放在Public目錄下:像我這樣:
step4:創建控制器:這裡創建了一個WxJsAPIController的控制器,這裡大家隨便起名字,只要這個跟你們在公眾平台上的設置相對應就可以(公眾平台設置稍後介紹)
下面是控制器的代碼部分了,首先初始化控制器,將WxPayPubHelper導入
/**
* 初始化
*/
public function _initialize()
{
//引入WxPayPubHelper
vendor(‘WxPayPubHelper.WxPayPubHelper’);
}
複製代碼
接下來是使用統一支付介面,獲取prepay_id的方法:
public function jsApiCall()
{
//使用jsapi介面
$jsApi = new \JsApi_pub();
//=========步驟1:網頁授權獲取用戶openid============
//通過code獲得openid
if (!isset($_GET[‘code’]))
{
//觸發微信返回code碼
$url = $jsApi-createOauthUrlForCode(C(‘WxPayConf_pub.JS_API_CALL_URL’));
Header(“Location: $url”);
}else
{
//獲取code碼,以獲取openid
$code = $_GET[‘code’];
$jsApi-setCode($code);
$openid = $jsApi-getOpenId();
}
//=========步驟2:使用統一支付介面,獲取prepay_id============
//使用統一支付介面
$unifiedOrder = new \UnifiedOrder_pub();
//設置統一支付介面參數
//設置必填參數
//appid已填,商戶無需重複填寫
//mch_id已填,商戶無需重複填寫
//noncestr已填,商戶無需重複填寫
//spbill_create_ip已填,商戶無需重複填寫
//sign已填,商戶無需重複填寫
$unifiedOrder-setParameter(“openid”,$openid);//商品描述
$unifiedOrder-setParameter(“body”,”貢獻一分錢”);//商品描述
//自定義訂單號,此處僅作舉例
$timeStamp = time();
$out_trade_no = C(‘WxPayConf_pub.APPID’).$timeStamp;
$unifiedOrder-setParameter(“out_trade_no”,$out_trade_no);//商戶訂單號
$unifiedOrder-setParameter(“total_fee”,”1″);//總金額
$unifiedOrder-setParameter(“notify_url”,C(‘WxPayConf_pub.NOTIFY_URL’));//通知地址
$unifiedOrder-setParameter(“trade_type”,”JSAPI”);//交易類型
//非必填參數,商戶可根據實際情況選填
//$unifiedOrder-setParameter(“sub_mch_id”,”XXXX”);//子商戶號
//$unifiedOrder-setParameter(“device_info”,”XXXX”);//設備號
//$unifiedOrder-setParameter(“attach”,”XXXX”);//附加數據
//$unifiedOrder-setParameter(“time_start”,”XXXX”);//交易起始時間
//$unifiedOrder-setParameter(“time_expire”,”XXXX”);//交易結束時間
//$unifiedOrder-setParameter(“goods_tag”,”XXXX”);//商品標記
//$unifiedOrder-setParameter(“openid”,”XXXX”);//用戶標識
//$unifiedOrder-setParameter(“product_id”,”XXXX”);//商品ID
$prepay_id = $unifiedOrder-getPrepayId();
//=========步驟3:使用jsapi調起支付============
$jsApi-setPrepayId($prepay_id);
$jsApiParameters = $jsApi-getParameters();
$this-assign(‘jsApiParameters’,$jsApiParameters);
$this-display(‘pay’);
//echo $jsApiParameters;
}
複製代碼
這裡都是複製微信demo的,改改名字罷了,沒什麼其他的
接下來是非同步通知方法,也是複製的微信demo上的
public function notify()
{
//使用通用通知介面
$notify = new \Notify_pub();
//存儲微信的回調
$xml = $GLOBALS[‘HTTP_RAW_POST_DATA’];
$notify-saveData($xml);
//驗證簽名,並回應微信。
//對後台通知交互時,如果微信收到商戶的應答不是成功或超時,微信認為通知失敗,
//微信會通過一定的策略(如30分鐘共8次)定期重新發起通知,
//儘可能提高通知的成功率,但微信不保證通知最終能成功。
if($notify-checkSign() == FALSE){
$notify-setReturnParameter(“return_code”,”FAIL”);//返回狀態碼
$notify-setReturnParameter(“return_msg”,”簽名失敗”);//返回信息
}else{
$notify-setReturnParameter(“return_code”,”SUCCESS”);//設置返回碼
}
$returnXml = $notify-returnXml();
echo $returnXml;
//==商戶根據實際情況設置相應的處理流程,此處僅作舉例=======
//以log文件形式記錄回調信息
// $log_ = new Log_();
$log_name= __ROOT__.”/Public/notify_url.log”;//log文件路徑
log_result($log_name,”【接收到的notify通知】:\n”.$xml.”\n”);
if($notify-checkSign() == TRUE)
{
if ($notify-data[“return_code”] == “FAIL”) {
//此處應該更新一下訂單狀態,商戶自行增刪操作
log_result($log_name,”【通信出錯】:\n”.$xml.”\n”);
}
elseif($notify-data[“result_code”] == “FAIL”){
//此處應該更新一下訂單狀態,商戶自行增刪操作
log_result($log_name,”【業務出錯】:\n”.$xml.”\n”);
}
else{
//此處應該更新一下訂單狀態,商戶自行增刪操作
log_result($log_name,”【支付成功】:\n”.$xml.”\n”);
}
//商戶自行增加處理流程,
//例如:更新訂單狀態
//例如:資料庫操作
//例如:推送支付完成信息
}
}
複製代碼
這裡我把記錄日誌的類寫到了function.php中:
function log_result($file,$word)
{
$fp = fopen($file,”a”);
flock($fp, LOCK_EX) ;
fwrite($fp,”執行日期:”.strftime(“%Y-%m-%d-%H:%M:%S”,time()).”\n”.$word.”\n\n”);
flock($fp, LOCK_UN);
fclose($fp);
}
複製代碼
好了 其實控制器的方法就這麼多,沒什麼其他的了,下面看一下頁面,直接上代碼吧:
!DOCTYPE html
html
head
meta http-equiv=”content-type” content=”text/html;charset=utf-8″/
title微信安全支付/title
script type=”text/javascript”
//調用微信JS api 支付
function jsApiCall()
{
WeixinJSBridge.invoke(
‘getBrandWCPayRequest’,
?php echo $jsApiParameters; ?,
function(res){
WeixinJSBridge.log(res.err_msg);
alert(res.err_code+res.err_desc+res.err_msg);
//alert(“{$jsApiParameters}”);
}
);
}
function callpay()
{
if (typeof WeixinJSBridge == “undefined”){
if( document.addEventListener ){
document.addEventListener(‘WeixinJSBridgeReady’, jsApiCall, false);
}else if (document.attachEvent){
document.attachEvent(‘WeixinJSBridgeReady’, jsApiCall);
document.attachEvent(‘onWeixinJSBridgeReady’, jsApiCall);
}
}else{
jsApiCall();
}
}
/script
/head
body
/br/br/br/br
div align=”center”
button style=”width:210px; height:30px; background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;” type=”button” onclick=”callpay()” 貢獻一下/button
/div
/body
/html
複製代碼
無須改動什麼,直接複製就好
接下來是微信公眾平台上的配置了,這裡我遇到過問題,如果有在這裡遇到問題的同學請留言,比如出現了access_deined或者access_notallowed等問題,這都可能是因為這裡配置不對。
JS交互微信之JSAPI支付
本篇為 JS交互微信系列篇 的第四篇 微信JSAPI支付 ,記錄在微信內置瀏覽器內用調用微信支付過程。
JSAPI支付是用戶在微信中打開商戶的H5頁面,商戶在H5頁面通過調用微信支付提供的JSAPI介面調起微信支付模塊完成支付。
要擁有兩個賬號:
要開通產品中心的JSAPI支付。然後 產品中心=開發配置=支付配置=公眾號支付配置 綁定支付授權目錄,寫已通過ICP備案的域名。
另外,要在ip白名單中,配置測試地址ip和線上生產地址ip,不然各種回調都會失敗!
由於在微信內支付需要獲取用戶的 openid ,要獲取它則必須通過網頁授權配置。在公微信公眾平台中, 公眾號設置=功能設置=網頁授權域名 中按要求填寫。
在支付流程方面,重點依然都在後端處理,前端方面步驟比較簡單。本文只敘述前端內容。
在將要進入支付的前一頁面,直接接入微信授權,然後跳轉進要支付的那個頁面。舉個例子:有a、b兩個頁面,在b頁面用到支付,b頁面由a頁面跳轉而來。那麼在a頁面跳b頁面的時候,別直接跳轉b的url,而是跳轉到:
{appId}redirect_uri={b.html}response_type=codescope=snsapi_base#wechat_redirect
我們注意到,這裡有這兩個需要自己寫的參數: appid 和 redirect_uri ,意義是:
另外,還有一個注意的點是, b.html這個url我們要進行encode轉碼,不然地址解析可能會出現問題!
上一步執行完後,在微信瀏覽器中,我們會得到一個鏈接,類似:
b.html?code={code}state=#/
在此處,我們得到了一個code值,這就是我們獲取 openid 的憑證了。
獲取方法當然是把值傳給後台,後台去處理啦~
在上一步中,我們拿到code值後,就可以提交一些信息給後端了,比如商品相關屬性、總價等,另外加上code值,傳給後端。後端一頓操作後,返回給前端。我們需要的參數如下(後端返回下面這些參數):
上個步驟拿到需要交互微信的參數後,就開始調用微信的支付介面了,如下:
至此,調用微信JSAPI來完成在微信內的支付就完成了。
微信支付怎麼配置jsapi
微信支付,是微信向有出售物品/提供服務需求的商家提供推廣銷售、支付收款、經營分析的整套解決方案,包括多種支付方式,如付款碼支付、JSAPI支付、小程序支付、APP支付、電腦網站支付、企業微信支付、H5支付,以及多種支付工具,如微信紅包、代金券等。
微信支付配置步驟:
步驟1:註冊支付商戶號
步驟2、秘鑰(32位)
步驟3、上傳證書
步驟4、商戶號新增小程序授權(注意授權狀態是否是成功)
步驟5、公眾號支付、JSAPI開通
登錄小程序後台找到配置管理→支付配置
登錄開通微信支付商戶平台(),在微信支付商戶平台裡面進行查找商戶號和設置API密鑰、下載證書
以下步驟查找上述基礎的內容在哪個地方查找。
步驟1、支付商戶號查找:
(註:登錄商戶號盡量使用360瀏覽器或者谷歌瀏覽器)
進入後在 賬戶中心—商戶信息、可以看到微信支付商戶號、把商戶號記一下,填到後台。
註:首次進入微信支付後台需要下載控制項和操作證書(按照提示一步步操作即可)
步驟二:API密鑰:隨後點擊下面的API安全、設置一下API秘鑰,API密鑰必須是32位字母或數字
註:該處設置秘鑰時看下設置下方的API秘鑰,不要設置APIV3的秘鑰。
註:該處設置下後把新設置的密鑰填到製作後台。
步驟三:證書路徑、密鑰路徑:API秘鑰設置好了之後、點擊下載API證書
(註:該處證書上傳用於退款。退款需要往商戶號里充值錢。)
下載後是一個壓縮包,然後解壓、然後根據名稱分別上傳到證書路徑、密鑰路徑。
步驟四:小程序在公眾號里申請,公眾號里開通的微信支付;該方式需要先登錄商戶號-產品中心-APPID授權管理-新增該小程序的授權。具體如下圖:
如提示已綁定(此步驟跳過)
授權後到微信小程序後台同意授權。如圖:
確保上圖申請單狀態是授權成功。
步驟五:查看微信支付商戶號公眾號支付、JSAPI是否開通。如下圖:(如未開通,點擊開通下,如果沒有公眾號支付可不用管)
(1)公眾號支付開通(如果沒有公眾號支付,此步驟跳過)
(2)JSAPI開通
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/303749.html