這次總結一下使用者在微信内打開網頁時,可以調用微信支付完成下單功能的子產品開發,也就是在微信内的H5頁面通過jsApi接口實作支付功能。當然了,微信官網上的微信支付開發文檔也講解的很詳細,并且有實作代碼可供參考,有的朋友直接看文檔就可以自己實作此支付接口的開發了。
一、前言
為何我還寫一篇微信支付接口的博文呢?第一,我們必須知道,所謂的工作經驗很多都是靠總結出來的,你隻有總結了更多知識,積累了更多經驗,你才能在該行業中脫穎而出,我個人覺得如今的招聘,很多都需要工作經驗(1年、3年、5年....),其實,工作時間的長久不能衡量一個人技術水準的高低,有的人一年的工作經驗能拿3年工作經驗的程式猿的工資,有的3年工作經驗的卻有可能比别人隻有一年工作經驗的還低,是以說,總結才能讓自己的知識體系,經驗深度更牛逼更穩固(雖然寫一篇博文挺花費時間的);第二,寫博文分享給大家還是挺有成就感的,首先是能讓新手從我分享的博文中能學到東西,并且能快速将博文所講解的技術運用到實際中來,是以我寫的博文基本上能讓新人快速讀懂并且容易了解,另外,技術大神的話,看到博文有講解的不對之處,還可以指出,并且可以交流,何樂而不為呢,我們需要的就是分享和交流。
扯遠了,直接進入該主題的詳解。
現在的微信支付方式有N種,看下圖,有刷卡支付、公衆号支付、掃碼支付和APP支付,另外還有支付工具的開發,本博文選擇的是公衆号支付借口而開發進行講解,其他幾種支付接口開發基本上思路都是一樣的,隻要你能看懂我這博文所講解的基本思路,你基本上也能獨自開發其他幾個支付接口。

二、思路詳解
我們可以拿微信支付接口文檔裡的業務流程時序圖看看,如下圖,基本思路是這樣子:首先在背景生成一個連結,展示給使用者讓使用者點選(例如頁面上有微信支付的按鈕),使用者點選按鈕後,網站背景會根據訂單的相關資訊生成一個支付訂單,此時會調用統一下單接口,對微信支付系統發起請求,而微信支付系統受到請求後,會根據請求過來的資料,生成一個 預支付交易會話辨別(prepay_id,就是通過這個來識别該訂單的),我們的網站收到微信支付系統的響應後,會得到prepay_id,然後通過自己構造微信支付所需要的參數,接着将支付所需參數傳回給用戶端,使用者此時可能會有一個訂單資訊頁,會有一個按鈕,點選支付,此時會調用JSAPI接口對微信支付系統發起 請求支付,微信支付系統檢查了請求的相關合法性之後,就會提示輸入密碼,使用者此時輸入密碼确認,微信支付系統會對其進行驗證,通過的話會傳回支付結果,然後微信跳轉會H5頁面,這其中有一步是異步通知網站支付結果,我們網站需要對此進行處理(比如說異步支付結果通過後,需要更新資料表或者訂單資訊,例如标志使用者已支付該訂單了,同時也需要更新訂單日志,防止使用者重複送出訂單)。
三、代碼講解
本次開發環境用的是php5.6 + MySQL + Redis + Linux + Apache,所選用的架構的CI架構(這些環境不一定需要和我的一緻,架構也可以自己選擇,反正自己稍微修改下代碼就能移植過去了)。
微信支付接口的開發代碼我已經提前寫好了,在這裡我對其進行分析講解,友善大家能輕松了解,當然,假如你有一定的基礎,直接看代碼就能理清所有流程了,并且我的代碼基本上都寫上了注釋(對于新手來說,這一點比微信文檔所提供的代碼好一點)。
1、構造一個連結展示給使用者
在這先看看model裡所寫的幾個類:model裡有幾個類:微信支付類、統一下單接口類、響應型接口基類、請求型接口基類、所有接口基類、配置類。為何要分那麼多類而不在一個類裡實作所有的方法的,因為,這樣看起來代碼邏輯清晰,哪個類該幹嘛就幹嘛。
這裡我直接附上model的代碼了,裡面基本上每一個類每一個方法甚至每一行代碼都會有解釋的了,這裡我就不對其展開一句句分析了:
Wxpay_model.php
擷取到code的URL後,将其配置設定到頁面去,讓使用者去點選,使用者進行點選後,就會從微信伺服器擷取到code,然後回調到redirect_uri所指的位址去。
2、擷取到code後,會回調到redirect_uri所指向的位址去,這裡是到了/Wxpay/confirm/,看看這個confirm方法是打算幹嘛的:
這一步開始去取JSAPI支付接口所需要的資料了,這一步算是最主要的一步,這裡還會調用統一下單接口擷取到prepay_id,我們跳到
$this->wxpay_model->wxPayJsApi($orderData) 看看:
這裡首先是取得下單接口所需要的資料;
接着擷取到code碼,通過code碼擷取到openid;
然後調用統一下單接口,取得下單接口的響應資料,即prepay_id;
最後取得微信支付JSAPI所需要的資料。
這就是上面這個方法所要做的事情,取到資料後,會将資料配置設定到模闆裡,然後根據官方文檔所給的參考格式将其放在js裡,如下面的代碼:
3、此時使用者隻需要點選支付,就可以開始進入支付界面了,接着就是輸入密碼,确認,最後會提示支付成功,緊接着網站會提供一個支付成功跳轉頁面。類似微信文檔裡所提供的圖檔這樣,這裡我就直接截取文檔裡的案例圖了:
4、這裡還有一步,就是微信支付系統會異步通知網站背景使用者的支付結果。在擷取統一下單資料時,我們指定了一個通知位址,在model裡可以找到
支付成功後,微信支付系統會将支付結果異步發送到此位址上/Wxpay/pay_callback/ ,我們來看一下這個方法
這方法就是對支付是否成功,對網站的支付相關邏輯進行後續處理,例如假如支付失敗,就需要記錄日志裡說明此次交易失敗,或者是做某一些邏輯處理,而支付成功又該如何做處理,等等。
這裡我們就分析下這個方法 $this->wxpay_model->wxPayNotify($postData); 對異步傳回的資料進行安全性校驗,例如驗證簽名,看看model裡的這個方法:
如果驗證通過,則就開始進行交易成功或者失敗時所要做的邏輯處理了,這邏輯處理的代碼我就不寫了,因為每一個網站的處理方式都不一樣,我這裡是這樣處理的,我把思路寫下,友善不懂的朋友可以按着我的思路去完善後續的處理:首先是檢視資料庫裡的訂單日志表,看這筆交易之前是否已經交易過了,交易過就不用再更新資料表了,如果沒交易過,就會将之前存在redis的訂單資料給取出來,再将這些資料插入到訂單日志表裡,差不多就這樣處理。
好了,基于H5的微信支付接口開發詳解就講到這裡,如果你認真理清博文裡所講解的思路,自己基本上也可以嘗試開發此接口了,同時隻要會了這個,你也基本上可以開發二維碼支付,刷卡支付等等的支付接口。
這裡我附上此次開發中的完整代碼供大家閱讀:
控制器:Wxpay.php
模型:Wxpay_model.php
視圖:index.tpl
視圖:confirm.tpl
裡面所用到的一些自定義函數可以在我上一篇博文裡找找,那裡已經提供了代碼參考了。
現在我們的線上項目是微信支付,支付寶支付,網銀支付信用卡支付的功能都有,并且PC和WAP端都分别對應有。是以整一個支付系統子產品還算比較完整,後期有時間我會總結和分享下其他的支付接口開發的博文,希望有興趣的博友可以關注下哦!!
本次分享和總結就到此。
如何聯系我:【萬裡虎】www.bravetiger.cn
【QQ】3396726884 (咨詢問題100元起,幫助解決問題500元起)
【部落格】http://www.cnblogs.com/kenshinobiy/