JAVA開發(fā)微信支付-公眾號支付/微信瀏覽器支付(JSAPI)

支付場景隨處可見,上篇文章我已經(jīng)介紹過支付寶支付的相關(guān)知識以及代碼,今天我們來介紹一下微信支付的相關(guān)業(yè)務場景以及集成的相關(guān)步驟。

1.獲取微信支付四大參數(shù)

要想集成微信支付,得先申請兩個賬號

①微信公眾已認證的服務號,并且需要開通微信支付該能(必須是企業(yè)才有資格申請,請你找你家產(chǎn)品去申請吧),②微信商戶平臺賬號;這兩個賬號一個不能少。此處已默認你已有上兩個賬號

此處是賬號模板,請參考:

????微信公眾平臺:賬戶:con*******om 登錄密碼 ******

????公眾APPID:wx15*********a8

????APPSECEPT : c210***************892d7

????微信商戶平臺:賬戶:149**********6742 登錄密碼:******

????商戶ID:14******42

????API密鑰:5d5************b35b

其中比較不好找的是商戶的API密鑰:在商戶平臺的賬戶中心下:需要用戶自行下載證書及安裝,(略)

至此我們需要的APPID(appid),APPSECEPT(appsecret),商戶ID(mch_id),API密鑰(paternerKey),四個重要參數(shù)已拿到,括號中是我們代碼所用的變量名稱請?zhí)崆笆煜ぁ?/p>

2:平臺配置

(1).配置支付目錄:商戶平臺:

配置此目錄是代碼中“微信支付”所在頁面的地址,可以是目錄不一定是全路徑-如http://www.wangtao.com/order/-----此一級域名需要ICP備案。

點擊添加

(2).配置授權(quán)域名:微信公眾平臺:

????支付過程需要獲取用戶openid,必須經(jīng)過網(wǎng)頁授權(quán)配置才可以,要不然獲取不到openid。

點擊設(shè)置,按說明設(shè)置

3.開發(fā)流程:

微信支付原理(說白了就是調(diào)用官方文檔的“統(tǒng)一下單”接口,之后將微信服務器返回的參數(shù)做個加工后,返回到前臺(JSP頁面),就OK了。咱們要做的就是想方設(shè)法的湊齊統(tǒng)一下單的所有參數(shù)“而已”,“而已”,“而已”,這個而已也就是最大的挑戰(zhàn))。所有參數(shù)解釋請參考:官方文檔:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1;

????咱們只考慮必填參數(shù),其他參數(shù)可以就看你的了。

????先來看看所有參數(shù):

其中的必填參數(shù)有:

1.????????appid APPID (已有)

2.????????mch_id 商戶ID (已有)

3.????????nonce_str 隨機字符串

4.????????sign 簽名

5.????????body 所支付的名稱

6.????????out_trade_no 咱們自己所提供的訂單號,需要唯一

7.????????total_fee 支付金額

8.????????spbill_create_ip IP地址

9. ? ? ? ?notify_url 回調(diào)地址

10.????? ?trade_type 支付類型

11.???????openid 支付人的微信公眾號對應的唯一標識

????只要把這11個湊齊就齊活,現(xiàn)在咱們從第3個開始一個一個的獲?。辉谶@之前先從官網(wǎng)把公眾號支付的sdk下載下來,如圖

主要是用其中的WXPayUtil工具類中的一些方法。當然其他的類我看不懂,要是看懂了,就不至于這么費勁了。

好了開始咱們的取值之旅了:

1.????????appid APPID (已有)

2.????????mch_id 商戶ID (已有)

3.????????nonce_str 隨機字符串用WXPayUtil中的generateNonceStr()即可,就是生成UUID的方法;

4.????????sign 簽名 用WXPayUtil中的generateSignature(finalMap<String, String> data, String key)方法,data是將除了sign外,其他10個參數(shù)放到map中,key是四大配置參數(shù)中的API秘鑰(paternerKey)(這里不要著急管它,最后處理它);

5.????????body 所支付的名稱

6.????????out_trade_no 自己后臺生成的訂單號,只要保證唯一就好:如“2018013000001”

7.????????total_fee 支付金額 單位:分,為了測試此值給1,表示支付1分錢

8.????????spbill_create_ip IP地址 網(wǎng)上很多ip的方法,自己找,此處測試給“127.0.0.1”

9.????????notify_url 回調(diào)地址:這是微信支付成功后,微信那邊會帶著一大堆參數(shù)(XML格式)請求這個地址多次,這個地址做我們業(yè)務處理如:修改訂單狀態(tài),贈送積分等。Ps:支付還沒成功還想這么遠干嘛,最后再說。地址要公網(wǎng)可以訪問。

10.????trade_type 支付類型 咱們是公眾號支付此處給“JSAPI”

11.????openid 支付人的微信公眾號對應的唯一標識,每個人的openid在不同的公眾號是不一樣的,這11個參數(shù)里,最費勁的就是他了,其他的幾乎都已經(jīng)解決,現(xiàn)在開發(fā)得到這個參數(shù)。

????獲得openid的部分內(nèi)容應該不屬于微信支付的范疇,屬于微信公眾號網(wǎng)頁授權(quán)的東西,詳情請參考微信網(wǎng)頁授權(quán):

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

獲得openid步驟:

第一步:用戶同意授權(quán),獲取code

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

注意:1. redirect_uri參數(shù):授權(quán)后重定向的回調(diào)鏈接地址,?請使用?urlEncode?對鏈接進行處理。

2.?scope:用snsapi_base?。

通過此鏈接可以獲取code,可以在一個空頁面設(shè)置一個a標簽,鏈接至其redirect_uri的地址。點擊a標簽,即可鏈接到redirect_uri的地址,并攜帶code。

<a access_token":"ACCESS_TOKEN",

"expires_in":7200,

"refresh_token":"REFRESH_TOKEN",

"openid":"OPENID",//就是它,只要這個值

"scope":"SCOPE" }

好了,access_token是有了,不過咱們不關(guān)心它,咱們關(guān)心的是openid,有了它一就回到咱們“統(tǒng)一下單”接口里,所有的參數(shù)已經(jīng)就位就等發(fā)送了。在回顧下11個必填參數(shù):

1.????????appid APPID (已有)

2.????????mch_id 商戶ID (已有)

3.????????nonce_str 隨機字符串用WXPayUtil中的generateNonceStr()即可,就是生成UUID的方法;

4.????????sign 簽名 用WXPayUtil中的publicstatic String generateSignature(final Map data, Stringkey)方法,data是將除了sign外,其他10個參數(shù)放到map中,key是四大配置參數(shù)中的API秘鑰(paternerKey)(此時可以處理它了,不過其他10個參數(shù)都有了,它就easy了,先new一個map,依次put其他10個參數(shù),就可以用generateSignature方法了,得到了sign后,不要忘記再將sign put到只有10個參數(shù)的map中,這樣才能湊齊最后的第11個參數(shù)。準備召喚神龍吧。);

5.????????body 所支付的名稱

6.????????out_trade_no 自己后臺生成的訂單號,只要保證唯一就好:如“2018013000001”

7.????????total_fee 支付金額 單位:分,為了測試此值給1,表示支付1分錢

8.????????spbill_create_ip IP地址 網(wǎng)上很多ip的方法,自己找,此處測試給“127.0.0.1”

9.????????notify_url 回調(diào)地址:這是微信支付成功后,微信那邊會帶著一大堆參數(shù)(XML格式)請求這個地址多次,這個地址做我們業(yè)務處理如:修改訂單狀態(tài),贈送積分等。Ps:支付還沒成功還想這么遠干嘛,最后再說。地址要公網(wǎng)可以訪問。

10.????trade_type 支付類型 咱們是公眾號支付此處給“JSAPI”

11.????openid (已有)

好了,準備工作完成,開始發(fā)送POST請求吧,上面提到網(wǎng)上找到的get請求的方法,此處用到post請求的方法,請求微信"統(tǒng)一下單接口https://api.mch.weixin.qq.com/pay/unifiedorder。發(fā)送前先用WXPayUtil工具類中的public static String mapToXml(Map<String,String> data)方法將有11個參數(shù)的map轉(zhuǎn)成XML格式。發(fā)送后會返回String類型的返回值,如果你夠幸運的話應該會得到XML的字符串:

<xml>

??<return_code><![CDATA[SUCCESS]]></return_code>

? <return_msg><![CDATA[OK]]></return_msg>

? <appid><![CDATA[wx2421b1c4370ec43b]]></appid>

? <mch_id><![CDATA[10000100]]></mch_id>

? <nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str>

? <openid><![CDATA[oUpF8uMuAJO_M2pxb1Q9zNjWeS6o]]></openid>

? <sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign>

? <result_code><![CDATA[SUCCESS]]></result_code>

? <prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>

? <trade_type><![CDATA[JSAPI]]></trade_type>

</xml>

先用WXPayUtil類中的public static Map xmlToMap(String strXML)方法,將剛才返回的XML格式的字符串轉(zhuǎn)成map(為了方便取值)。map.get(“prepay_id”)就得到了prepay_id的值(比如得到的是:“wx2018…250…9981…666”),記住它,先保留此值。

看看前臺都需要接收哪些值吧。

6個參數(shù),咱們還是一個一個分析:

1.????????appId:四大參數(shù)之一的APPID;

2.????????timestamp:時間戳(newDate()即可)

3.????????nonceStr:隨機字符串,再次用WXPayUtil中的generateNonceStr()即可;

4.????????package:就tm是它用到了prepay_id,但是還不是直接取值,還非要固定格式的,值的格式例如:”prepay_id= wx2018…250…9981…666”

5.????????signType:寫MD5就好

6.????????paySign:又來了還是簽名算法 ,按照上面的方法,用WXPayUtil中的publicstatic String generateSignature(final Map data, Stringkey)方法,data是將除了paySign外,其他5個參數(shù)放到map中,key是四大配置參數(shù)中的API秘鑰(paternerKey),得到了paySign后,不要忘記再將paySign?put到只有5個參數(shù)的map中,這樣才能湊齊最后的第6個參數(shù)。);

注意:此處有個小bug,很多人會被坑的很慘,不注意就掉坑里,我是掉進去了,就是最關(guān)鍵的第4個參數(shù)package,眼熟不眼熟,這tm是JAVA的關(guān)鍵字,不能用來當變量名。

所有的參數(shù)有了,返回給前端的方法有很多,簡易用springMVC的@ResponseBody注解,即可將這個有6個參數(shù)的map按json格式傳給前端。好了,后臺工作完成。

????前端的工作就容易多了,格式比較固定因為是微信固定格式,所以直接貼出我的代碼,你只要更換觸發(fā)支付的事件和異步的地址即可.

前端簡單來說:1.一個空jsp頁面上有個a標簽,用來獲取code,并跳轉(zhuǎn)到pay.jsp(上面提到過)。

????????????????????????2.pay.jsp中需要異步到后臺需要帶code參數(shù),pay.jsp中頁面的地址上帶著code,想獲取code的方法很多,拋磚引引玉:(定義一個按鈕,按鈕上綁定一個code的屬性值是頁面鏈接的code的值,用EL表達式取的參數(shù)值,點擊按鈕觸發(fā)點擊事件)。

????????????????????? ? 3.接收后臺傳過來值,調(diào)用固定方法。

Pay.jsp中內(nèi)容只有一個”微信支付”的按鈕,和js的代碼,以下是js內(nèi)容(獲取code方法可以修改),其它內(nèi)容不要修改

<!—pay.jsp中點擊”微信支付”按鈕執(zhí)行pay()方法>

<input id="code"type="button" value="微信支付"onclick="pay()" code="${param.code }"/>

如果覺得對你有幫助,可以搜索公眾號? ‘蛋皮皮’? ?關(guān)注作者支持一下,每天會不定時回復留言(有任何問題都可以留言哦)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。