【微信支付】公眾號、商戶基礎配置和流程(包括設置支付授權目錄、測試支付目錄和白名單、JS接口安全域名、授權回調域名等)


一、使用場景以及說明

     使用場景:商戶已有H5商城網站,用戶通過消息或掃描二維碼在微信內打開網頁時,可以調用微信支付完成下單購買的流程。

 說明:1.用戶打開圖文消息或者掃描二維碼,在微信內置瀏覽器打開網頁進行的支付。

     2.商戶網頁前端通過使用微信提供的 JSAPI,調用微信支付模塊。這種方式,適合需要在商戶網頁進行選購下單的購買流程。

二、准備工作

公共號支付需要提前在微信公共平台進行業務配置,包括設置支付授權目錄測試支付目錄和白名單設置JS接口安全域名以及設置授權回調頁面域名

1.進行微信公眾支付之前,我們需要申請個公眾號,以及申請微信支付的功能。

 

2.支付授權目錄:

位置:微信支付——>開發配置——>公共號支付

1) 所有使用公眾號支付方式發起支付請求的鏈接地址,都必須在支付授權目錄之下;

2) 正式支付授權目錄最多設置3個,測試授權目錄最多設置1個,且域名必須通過ICP備案;==》截止目前(2017.11.15)該支付授權目錄設置已經移動至

商戶平台-->產品中心-->開發配置(傳送門:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_3),且最多可以同時設置5個目錄

目錄示例:

      ||||||||    如果未設置授權目錄或者目錄不對,在手機微信調用jsapi時報錯  

 

 

3) 頭部要包含http或https,須細化到二級或三級目錄,以左斜杠“/”結尾。

業務中發起支付的頁面地址必須在授權目錄下,否則調用下單接口時會提示“當前頁面的URL未注冊”。

 

 

這里再啰嗦地補充兩點:

1)不使用框架的情況下,比如將官方sdk下載下來,改成demo放在根目錄下,demo/example/jaspi.php,授權目錄可參考 http://www. ×××.com/demo/example/

2 )使用框架的情況下,比如ThinkPHP, 項目名叫test ,目錄結構如下,test/Application/Home/controller/WxpayController.class.php,授權目錄可參考 http://www. ×××.com/index.php/Home/Wxpay/

 

3.JS接口安全域名:

位置:微信支付——>公共號設置——>功能設置——>JS接口安全域名

說明:設置JS接口安全域名后,公眾號開發者可在該域名下調用微信開放的JS接口。

注意事項:

1) 可填寫三個域名,要求是一級或一級以上域名(例:qq.com,或者 www.qq.com ),需使用字母、數字及“-”的組合,不支持IP地址及端口號;

2) 填寫的域名須通過ICP備案的驗證;

3)一個自然月內最多可修改並保存三次。

 

4.授權回調頁面域名:(用來jsapi支付的必須)

位置:微信支付——>接口權限——>網頁授權獲取用戶基本信息

用戶在網頁授權頁同意授權給公眾號后,微信會將授權數據傳給一個回調頁面,回調頁面需在此域名下,以確保安全可靠。

注意事項:

1) 回調頁面域名需使用字母、數字及“-”的組合,不支持IP地址及端口號。填寫的域名需與實際回調URL中的域名相同;

2) 填寫的域名須通過ICP備案的驗證。

獲取用戶授權時redirect_uri對應的URL必須在此域名下,否則回調的地址會無法打開。

 

 

 

三、開發步驟

說明:整個微信公眾號支付的流程如下:

【1】用戶點擊公眾號內微信商城打開H5的支付頁面

【2】H5頁面通過JS調用微信支付接口

【3】微信服務器通過判斷輸入的JSON數據,返回給客戶端相應的成功或失敗信息

官方demo結構如下:

 

1.JSAPI支付——H5網頁端調起支付接口 

1)用戶同意授權,獲取code

請求鏈接:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#we-chat_redirect

 

 

2)如果有code,直接就通過code能獲取用戶openid

如果沒有code,通過createOauthUrlForCode方法,傳入必要參數,獲取code

3)如果用戶同意授權,頁面將跳轉至 redirect_uri/?code=CODE&state=STATE。

若用戶禁止授權,則重定向后不會帶上code參數,僅會帶上state參數

redirect_uri?state=STATE

4)code說明以及scope的兩種方式說明

【1】code作為換取access_token的票據,每次用戶授權帶上的code將不一樣,code只能使用一次,5分鍾未被使用自動過期。

這里獲取到code 和 state(訂單號) 后, 對訂單進行驗證,用戶余額也進行驗證,如果條件都滿足則才能進行下面的流程。

【2】scope的兩種方式說明:

微信提供了兩種授權方式:snsapi_base和snsapi_userinfo。

snsapi_base:不彈出授權頁面,直接跳轉,只能獲取用戶openid;

snsapi_userinfo:彈出授權頁面,可通過openid拿到昵稱、性別、所在地。並且,即使在未關注的情況下,只要用戶授權,也能獲取其信息。

想要獲取code,需要構造如下地址:

2. 通過code換取網頁授權access_token (這里也獲取到了openid)

1)請求鏈接:https://api.weixin.qq.com/sns/oauth2/access_token

?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

 

 

2)獲取openid:openid是微信支付jsapi支付接口必須的參數

【1】如果網頁授權的作用域為snsapi_base(靜默授權),則本步驟中獲取到網頁授權access_token的同時,也獲取到了openid,snsapi_base式的網頁授權流程即到此為止。

【2】如果網頁授權作用域為snsapi_userinfo,則此時開發者可以通過access_token和openid拉取用戶信息了。

 

 

3)getOpenid方法中調用createOauthUrlForOpenid方法獲取openid

3. 調用統一支付接口獲取預付款id (這里有個小技巧:你如果直接把表單提交到這里,那就傻逼了。 你的服務器會和微信服務器交互2次,等拿到openid,你提交的數據早就被刷掉了,你可以把它放在session或者緩存里面,然后重定向到下面這個頁面,等拿到openid后再從session里面拿數據。

官方文檔說明:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1

1) 設置必傳參數,按照簽名參數產生簽名, 此時參與簽名字段有 : appid, mch_id , nonce_str, openid, body , out_trade_no, total_fee, notify_url , trade_type

2) 將必傳參數轉成xml,createXml方法。

3) 使用xml,請求統一支付接口 https://api.mch.weixin.qq.com/pay/unifiedorder

4) 得到xml格式的返回值結果

5) 將結果轉成數組,獲取預支付id

4. 使用jsapi調起支付

1. 通過getParameters方法設置必傳參數,接口輸入數據為json

2. 根據官方demo中jsapi.php 調起支付,得到支付結果

 

注:使用以上方式判斷前端返回,res.err_msg 將在用戶支付成功后返回 ok,但不保證它絕對可靠。

 

四、可能遇到的問題

1. 返回參數是xml,而不是直接輸出success ,這個與微信app支付有區別。

2. 參與簽名字段要保證一致,保證前后簽名一樣。

3. 由於存在重新發送后台通知的情況,因此同樣的通知可能會多次發送給商戶系統。商戶系統必須能夠正確處理重復的通知。比如在支付成功后寫入了支付日志,那么第二次回調前前判斷是否已經有了支付日志,如果有,直接退出不作處理就好了。

4 . 當用戶有余額,先用余額支付,剩下的才是微信 , 支付成功時,回調扣去余額

5. 如果同一筆訂單號修改多次價格進行支付,第二次支付時,會出現生成預支付訂單失敗,主要原因是同一筆訂單支付時,支付金額不能一樣,或者給到第三方的訂單號不一樣,所以解決方法就是訂單號+標志位(比如Z或A)+ 時間戳生成給到的第三方的支付號即可。

 

https://www.cnblogs.com/xuzhengzong/p/7840124.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM