本文目錄一覽:
- 1、如何用PHP實現微信支付,求教。新手!說明詳細點
- 2、JS交互微信之JSAPI支付
- 3、java實現微信支付,通過JSAPI發起支付請求
- 4、微信的jsapi支付能整合到thinkphp嗎
- 5、通過手機點鏈接後可以跳轉到微信支付的源碼怎麼寫?
如何用PHP實現微信支付,求教。新手!說明詳細點
以PHP語言為例,對微信支付的開發流程進行一下說明:
1.獲取訂單信息。
2.根據訂單信息和支付相關的賬號生成sign,並且生成支付參數。
3.將支付參數信息POST到微信伺服器,獲取返回信息。
4.根據返回信息生成相應的支付代碼(微信內部)或是支付二維碼(非微信內),完成支付。
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來完成在微信內的支付就完成了。
java實現微信支付,通過JSAPI發起支付請求
在config.jsp填 好 在ResponseHandler填下APPKEY 用wxm-pay-api-demo.html或者jsapi.jsp我測試是都可以用.試能用哪個用哪個吧 JS已經搞好了
ResponseHandler,ResponseHandler,payNotifyUrl.jsp都修了..
微信的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等問題,這都可能是因為這裡配置不對。
通過手機點鏈接後可以跳轉到微信支付的源碼怎麼寫?
微信公司平台帳號註冊後官方首頁很簡單,沒有導航欄目頁面新建等功能。需要通過三方軟體與微信介面做二次開發。首先要在現在微信開個介面,這是要工商局認證的。
最近一個項目用手機上的瀏覽器(不是微信瀏覽器)瀏覽html5網頁時,看到有的網站點擊「微信支付」時,直接打開了微信進行支付(也就是在瀏覽器直接調用微信),這個是怎麼做到的?
比如頁面上有個文字鏈接:微信支付,點擊之後就自動調取微信APP了,而且我不是用微信瀏覽器打開的網頁。最新實用的微信H5手機網站支付源碼實例。
效果圖片如下:
完整代碼如下:即使在Safari中,也是可以點擊一個鏈接到達微信支付界面,只是用戶支付完了以後,目前還沒有方法再返回到Safari。 如果是自己開發的app,當然更沒有任何問題了,可以實現和native app一樣的效果。
源碼如下:
html
head
meta http-equiv=”content-type” content=”text/html;charset=utf8″/
meta id=”viewport” name=”viewport” content=”width=device-width; initial-scale=1.0; maximum-scale=1; user-scalable=no;” /
body,p,ul,li,h1,h2,form,input{margin:0;padding:0;}
h1,h2{font-size:100%;}
ul{list-style:none;}
body{-webkit-user-select:none;-webkit-text-size-adjust:none;font-family:Helvetica;background:#ECECEC;}
html,body{height:100%;}
a,button,input,img{-webkit-touch-callout:none;outline:none;}
a{text-decoration:none;}
.hide{display:none!important;}
.cf:after{content:”.”;display:block;height:0;clear:both;visibility:hidden;}
a[class*=”btn”]{display:block;height:42px;line-height:42px;color:#FFFFFF;text-align:center;border-radius:5px;}
.btn-blue{background:#3D87C3;border:1px solid #1C5E93;}
.btn-green{background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #43C750), color-stop(1, #31AB40));border:1px solid #2E993C;box-shadow:0 1px 0 0 #69D273 inset;}
.charge{font-family:Helvetica;padding-bottom:10px;-webkit-user-select:none;}
.charge h1{height:44px;line-height:44px;color:#FFFFFF;background:#3D87C3;text-align:center;font-size:20px;-webkit-box-sizing:border-box;box-sizing:border-box;}
.charge h2{font-size:14px;color:#777777;margin:5px 0;text-align:center;}
.charge .content{padding:10px 12px;}
.charge .select li{position:relative;display:block;float:left;width:100%;margin-right:2%;height:150px;line-height:150px;text-align:center;border:1px solid #BBBBBB;color:#666666;font-size:16px;margin-bottom:5px;border-radius:3px;background-color:#FFFFFF;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;}
.charge .price{border-bottom:1px dashed #C9C9C9;padding:10px 10px 15px;margin-bottom:20px;color:#666666;font-size:12px;}
.charge .price strong{font-weight:normal;color:#EE6209;font-size:26px;font-family:Helvetica;}
.charge .showaddr{border:1px dashed #C9C9C9;padding:10px 10px 15px;margin-bottom:20px;color:#666666;font-size:12px;text-align:center;}
.charge .showaddr strong{font-weight:normal;color:#9900FF;font-size:26px;font-family:Helvetica;}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/240299.html