1. 程式人生 > >ThinkPHP中實現微信支付(jsapi支付)流程

ThinkPHP中實現微信支付(jsapi支付)流程

之前寫過一篇文章講了 PHP實現微信支付(jsapi支付)流程 ,詳見文章:。
當時的環境是沒有使用框架的,直接在一個域名指向的目錄下邊新建目錄之後訪問該目錄實現的,但應用到框架中,還是有一些問題,在ThinkPHP中,由於路由規則與支付授權目錄有出入,所以會報錯。本篇講講在TP中整合微信支付的流程。

鵝廠出的SDK和文件,就是讓你看不懂,使勁繞,這酸爽用了就知道。文件和SDK不是應該越簡單通俗易懂越好麼?難道只有使勁重構才能顯示出鵝廠程式猿技術的高超咩?額...是不是暴露了我菜鳥的屬性...其實SDK蠻好用,只是上一篇文章中也看到了,在支付完成回撥函式中,著實讓人繞的暈頭轉向。

對於不想被官方繞的,想在TP中使用微信支付的可以看看一個大神自己根據官方文件重構精簡打造而成的適用於TP的支付SDK,原始碼我下載下來看過了,程式碼寫的很優雅簡介,流程也很簡單,通俗易懂。詳見博文:
http://baijunyao.com/article/78


我自己還是皺著眉頭,使用了官方的SDK,也成功實現了支付,下面跟大家分享一下流程:
1.SDK下載和修改

這個就不過多講了,不知道的可以看看我的上一篇博文:,裡邊詳細詳述了下載下來的檔案哪些是需要修改的。

2.公眾號設定

A. 還是需要設定網頁授權域名,這個沒啥特殊的;
B. 這裡要注意一下支付授權目錄,使用TP很多人都使用的是重寫模式(REWRITE模式)或者在使用REWRITE模式的同時,使用偽靜態模式,這時候生成的連結為:[http://serverName/Home/Blog/read/id/1];如果使用的是PATHINFO模式的話,生成的連結就是:[http://serverName/index.php/Home/Blog/read/id/1],比如在Home模組下的Blog控制器中的某個方法進行支付,我們支付的授權目錄應該是[http://serverName/Home/Blog/]或者[http://serverName/index.php/Home/Blog/],這個根據自己的TP的設定的URL模式而定。

3.支付流程

(1)統一下單

下單的支付引數配置,這個跟上一篇講的基本不變,重點注意的是支付回撥驗證連結,因為要多次呼叫,我就直接在Application/Common/Common/function.PHP中將引數配置封裝起來了,我的SDK放在專案根目錄下的Api目錄下,所以引入SDK的時候不是使用Vendor函式。

  1. /** 
  2.  * 微信支付 
  3.  * @param  string   $openId     openid 
  4.  * @param  string   $goods      商品名稱 
  5.  * @param  string   $attach     附加引數,我們可以選擇傳遞一個引數,比如訂單ID
     
  6.  * @param  string   $order_sn   訂單號 
  7.  * @param  string   $total_fee  金額 
  8.  */
  9. function wxpay($openId,$goods,$order_sn,$total_fee,$attach){  
  10.     require_once APP_ROOT."/Api/wxpay/lib/WxPay.Api.php";  
  11.     require_once APP_ROOT."/Api/wxpay/payment/WxPay.JsApiPay.php";  
  12.     require_once APP_ROOT.'/Api/wxpay/payment/log.php';  
  13.     //初始化日誌
  14.     $logHandlernew CLogFileHandler(APP_ROOT."/Api/wxpay/logs/".date('Y-m-d').'.log');  
  15.     $log = Log::Init($logHandler, 15);  
  16.     $tools = new JsApiPay();  
  17.     if(empty($openId)) $openId = $tools->GetOpenid();  
  18.     $input = new WxPayUnifiedOrder();  
  19.     $input->SetBody($goods);                 //商品名稱
  20.     $input->SetAttach($attach);                  //附加引數,可填可不填,填寫的話,裡邊字串不能出現空格
  21.     $input->SetOut_trade_no($order_sn);          //訂單號
  22.     $input->SetTotal_fee($total_fee);            //支付金額,單位:分
  23.     $input->SetTime_start(date("YmdHis"));       //支付發起時間
  24.     $input->SetTime_expire(date("YmdHis", time() + 600));//支付超時
  25.     $input->SetGoods_tag("test3");  
  26.     //$input->SetNotify_url("http://".$_SERVER['HTTP_HOST']."/payment.php");  //支付回撥驗證地址
  27.     $input->SetNotify_url("http://".$_SERVER['HTTP_HOST']."/payment.php/WexinApi/WeixinPay/notify");  
  28.     $input->SetTrade_type("JSAPI");              //支付型別
  29.     $input->SetOpenid($openId);                  //使用者openID
  30.     $order = WxPayApi::unifiedOrder($input);    //統一下單
  31.     $jsApiParameters = $tools->GetJsApiParameters($order);  
  32.     return$jsApiParameters;  
  33. }  
注意,注意,敲黑板劃重點了: 支付回撥驗證連結,必須是沒有許可權驗證的,如果你自己訪問那個連結,還需要登入註冊驗證的,就不要嘗試了,必須要可以無障礙訪問的連結,而且也不要有一連串的引數傳遞。

最好就是簡單粗暴的[http://serverName/xxx.php],我在跟目錄下,類似於index.php,重新寫了一個專門的供支付回撥的入口檔案payment.php,和它對應的Application/目錄下的模組(WexinApi)、控制器(WeixinPay)及方法(notify):

  1. // 檢測PHP環境
  2. if(version_compare(PHP_VERSION,'5.3.0','<'))  die('require PHP > 5.3.0 !');  
  3. // $_GET['m']='Admin';
  4. // 開啟除錯模式 建議開發階段開啟 部署階段註釋或者設為false
  5. define('APP_DEBUG',True);  
  6. //指定模組控制器和方法
  7. $_GET['m']='WexinApi';  
  8. $_GET['c']='WeixinPay';  
  9. $_GET['a']='notify';  
  10. // 定義應用目錄
  11. define('APP_PATH','./Application/');  
  12. define("APP_ROOT",dirname(__FILE__));  
  13. // 引入ThinkPHP入口檔案
  14. require'./ThinkCore/ThinkCore.php';  
  15. // 親^_^ 後面不需要任何程式碼了 就是如此簡單
現在訪問[http://serverName/payment.php],就會直接進入到[http://serverName/payment.php/WexinApi/WeixinPay/notify],這樣回撥驗證連結可以寫[http://serverName/payment.php],也可以寫[http://serverName/payment.php/WexinApi/WeixinPay/notify]。 (2)發起支付

照樣很簡單:

  1. /** 
  2. * 支付測試 
  3. * 微信訪問:http://daoshi.sdxiaochengxu.com/payment.php/WexinApi/WeixinPay/pay 
  4. */
  5. publicfunction pay(){  
  6.     $order_sn = getrand_num(true);  
  7.     $openId = '';  
  8.     $jsApiParameters = wxpay($openId,'江南極客',$order_sn,1);  
  9.     $this->assign(array(  
  10.         'data' => $jsApiParameters
  11.     ));  
  12.     $this->display();  
  13. }  
  1. <html>
  2. <head>
  3.     <metahttp-equiv="content-type"content="text/html;charset=utf-8"/>
  4.     <metaname="viewport"content="width=device-width, initial-scale=1"/>
  5.     <title>小尤支付測試</title>
  6.     <scripttype="text/javascript">
  7.     //呼叫微信JS api 支付  
  8.     function jsApiCall()  
  9.     {  
  10.         var data={$data};  
  11.         WeixinJSBridge.invoke(  
  12. 相關推薦

    ThinkPHP實現支付(jsapi支付)流程

    之前寫過一篇文章講了 PHP實現微信支付(jsapi支付)流程 ,詳見文章:。 當時的環境是沒有使用框架的,直接在一個域名指向的目錄下邊新建目錄之後訪問該目錄實現的,但應用到框架中,還是有一些問題,在ThinkPHP中,由於路由規則與支付授權目錄有出入,所以會報錯。本篇講講在TP中整合微信支付的流程。

    在OpenJweb平臺實現刷卡支付(被動掃碼)

    微信刷卡支付流程:(1)顧客付款時,點微信錢包左上角的付款。(2)付款介面有二維碼、條碼和一排18位的數字,這個數字是有時間限制的,每分鐘重新整理一次。(3)商家POS機中錄完商品及價格後,用掃碼槍掃顧客手機中的條碼或二維碼,實際就是讀取顧客的18位的數字串,讀取到商家的系統

    小程式實現支付

    最近做小程式,涉及到微信支付,看了看微信小程式開發文件,儘管之前做過微信支付,還是有點懵逼,不過好在之前研究過,不然真的是無從下手。對比了一下發現,其實小程式中做支付比公眾號支付要省事很多,因為不需要支

    iOS實現外部H5支付完成後返回原APP(多APP也可實現)

    更改 開發 技術分享 服務器端 嚴重 圖片 正常 接口 width 看到微信最近放開了微信H5支付,公司決定把H5集成到多款APP上。下面記錄下了開發過程。 由於是微信新推出的支付方式,在網上搜索到的相關資料並不多,其中有一篇文章(點此跳轉)對我的整個開發過程起到了很大幫助

    python實現付款碼支付(刷卡支付)(純python)

    參考連結https://github.com/Jolly23/wx_pay_python https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_10&index=1 use.py from wx_pay impo

    JAVA實現掃碼支付回撥Demo

    掃碼效果演示圖 專案結構圖: 微信實現JAVA掃碼支付的Demo原始碼,做這個做的很辛苦,熬夜了幾個晚上才把支付和回撥做好的,在這裡貼一下相關程式碼,以免更多開發者避免遇到這些坑,有不動的問題可以加我Q76949433,提供技術支援 package com.

    Python實現小程式支付功能

    由於最近自己在做小程式的支付,就在這裡簡單介紹一下講一下用python做小程式支付這個流程。當然在進行開發之前還是建議讀一下具體的流程,清楚支付的過程。 1.支付互動流程  2.獲取openid(微信使用者標識) 1 import requests 2 3 from config import

    調jsapi 支付遇到的 坑坑

    坑1:支付簽名錯誤,這個改了半天,什麼都沒改,就重新編了下urlencode碼就好了  \(^o^)/~ 坑2:  報路由未被註冊 ,去改支付授權目錄改了幾次,精確到 調取微信jsapi當前上一級目錄就OK,不然不得行(注意這裡已thinkphp為主) 需具體瞭解更多詳情評

    PHP在PC端實現掃碼支付模式二

    遇到的問題是微信掃碼支付可以成功,但是掃碼成功之後的回撥函式卻怎麼也沒有反應。 吶吶吶,敲黑板,劃重點了,在網上看了好多資料說,PHP的PC端微信掃碼支付模式二這個回撥就是不會響應的!然後,這個回撥函式在連結上是不能跟引數的,並且模式一需要在微信開發者後臺配置

    java實現公眾號支付

    前面做了app微信支付的回撥處理,現在需要做微信公眾號的支付,花了一天多時間,終於折騰出來了!鑑於坑爹的微信官方沒有提供java版的demo,所以全靠自己按照同樣坑爹的文件敲敲敲,所以記錄下來,以供自己及後來人參考,不足之處,還請指正。 首先,我們貼出呼叫支付介面的H5頁

    Java實現掃碼支付---方式二

    話不多說直接上程式碼: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.

    laravel使用easyWeChat實現公眾號支付

    網上看了很多資料,沒有找到合適自己的,就乾脆自己寫一個吧 框架為laravel5.4,easyWeChat是4.0版本。 使用composer require "overtrue/larav

    JAVA WEB實現掃碼支付(模式二)

    一.準備微信掃碼支付要用到的相關引數,這裡將其全部寫入一個配置類,程式碼如下: public class ZbWxPayConfig {     public static String APP_ID = "***********************";     pub

    Core3.1 v3 JSAPI支付

    1、前言   “小魏呀,這個微信支付還要多久?”,“快了快了老闆,就等著最後一步了。。。”,“搞快點哈,就等著上線呢”,“.........”  因公司業務需要微信支付,以前沒弄過花了幾天時間寫

    Core3.1 v3 JSAPI支付 退款

    1、前言 上一篇寫了《Core3.1 微信v3 JSAPI支付》,這個屬於v3的介面規則,現在研究了下退款的介面我寫的時候它屬於v2介面規則文件。但凡微信支付文件裡面寫清楚點我也不會在這裡記錄一下。 2、乾貨      介面文件https://pay.weixin.qq.com/

    php(ThinkPHP實現小程序的登錄過程

    open word encode 實現 nfa long bstr acc his 源碼也在我的github中給出 https://github.com/wulongtao/think-wxminihelper 下面結合thinkPHP框架來實現以下微信小程序的登錄流程,

    AngularJS進階(十七)在AngularJS應用實現認證授權遇到的坑

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

    AngularJS進階 十七 在AngularJS應用實現認證授權遇到的坑

    在AngularJS應用中整合微信認證授權遇到的坑 注:請點選此處進行充電! 前言             專案開發過程中,移動端新近增加了一個功能“微信授權登入”,由於自己不是負責移動端開發的,但最後他人負責的部分未達到

    django實現訊息推送

    -公眾號(不能主動給使用者發訊息)   -認證的公眾號:需要營業執照,需要交錢,可以發多篇文章   -未認證的公眾號:一天只能發一篇文章 -服務號(微信推送)   -需要申請,需要認證   -可以主動給使用者推送訊息   -能給推送的人,必須關注我的服務號   -沙箱環境 -企業號   -企業裡用的: -你們

    iOS9實現分享到好友、朋友圈

    微信SDKdemo執行錯誤問題 微信SDK接入設定 實現分享到好友、朋友圈 微信SDKdemo執行錯誤問題 下載了官方的demo,激動地運行了一下,十幾個錯誤,內心其實是崩潰的。 根據錯誤提示,去修改a