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

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

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

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

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

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

????微信公眾平臺:賬戶: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),四個(gè)重要參數(shù)已拿到,括號中是我們代碼所用的變量名稱請?zhí)崆笆煜ぁ?/p>

2:平臺配置

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

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

點(diǎn)擊添加

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

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

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

3.開發(fā)流程:

微信支付原理(說白了就是調(diào)用官方文檔的“統(tǒng)一下單”接口,之后將微信服務(wù)器返回的參數(shù)做個(gè)加工后,返回到前臺(JSP頁面),就OK了柱查。咱們要做的就是想方設(shè)法的湊齊統(tǒng)一下單的所有參數(shù)“而已”,“而已”,“而已”,這個(gè)而已也就是最大的挑戰(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 隨機(jī)字符串

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 支付人的微信公眾號對應(yīng)的唯一標(biāo)識

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

主要是用其中的WXPayUtil工具類中的一些方法淋硝。當(dāng)然其他的類我看不懂,要是看懂了,就不至于這么費(fèi)勁了雹熬。

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

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

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

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

4.????????sign 簽名 用WXPayUtil中的generateSignature(finalMap<String, String> data, String key)方法,data是將除了sign外,其他10個(gè)參數(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格式)請求這個(gè)地址多次,這個(gè)地址做我們業(yè)務(wù)處理如:修改訂單狀態(tài),贈(zèng)送積分等橄唬。Ps:支付還沒成功還想這么遠(yuǎn)干嘛,最后再說。地址要公網(wǎng)可以訪問参歹。

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

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

????獲得openid的部分內(nèi)容應(yīng)該不屬于微信支付的范疇,屬于微信公眾號網(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?對鏈接進(jìn)行處理娱仔。

2.?scope:用snsapi_base?询枚。

通過此鏈接可以獲取code,可以在一個(gè)空頁面設(shè)置一個(gè)a標(biāo)簽,鏈接至其redirect_uri的地址悲伶。點(diǎn)擊a標(biāo)簽,即可鏈接到redirect_uri的地址,并攜帶code领斥。

<a access_token":"ACCESS_TOKEN",

"expires_in":7200,

"refresh_token":"REFRESH_TOKEN",

"openid":"OPENID",//就是它突雪,只要這個(gè)值

"scope":"SCOPE" }

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

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

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

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

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

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格式)請求這個(gè)地址多次,這個(gè)地址做我們業(yè)務(wù)處理如:修改訂單狀態(tài),贈(zèng)送積分等。Ps:支付還沒成功還想這么遠(yuǎn)干嘛,最后再說纽帖。地址要公網(wǎng)可以訪問宠漩。

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

11.????openid (已有)

好了,準(zhǔn)備工作完成,開始發(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個(gè)參數(shù)的map轉(zhuǎn)成XML格式懊直。發(fā)送后會返回String類型的返回值,如果你夠幸運(yùn)的話應(yīng)該會得到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個(gè)參數(shù),咱們還是一個(gè)一個(gè)分析:

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

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

3.????????nonceStr:隨機(jī)字符串,再次用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個(gè)參數(shù)放到map中,key是四大配置參數(shù)中的API秘鑰(paternerKey),得到了paySign后,不要忘記再將paySign?put到只有5個(gè)參數(shù)的map中,這樣才能湊齊最后的第6個(gè)參數(shù)融撞。)盼铁;

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

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

????前端的工作就容易多了,格式比較固定因?yàn)槭俏⑿殴潭ǜ袷?所以直接貼出我的代碼,你只要更換觸發(fā)支付的事件和異步的地址即可.

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

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

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

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

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寺晌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子澡刹,更是在濱河造成了極大的恐慌呻征,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罢浇,死亡現(xiàn)場離奇詭異陆赋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)嚷闭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門攒岛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胞锰,你說我怎么就攤上這事灾锯。” “怎么了嗅榕?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵顺饮,是天一觀的道長。 經(jīng)常有香客問我凌那,道長领突,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任案怯,我火速辦了婚禮,結(jié)果婚禮上澎办,老公的妹妹穿的比我還像新娘嘲碱。我一直安慰自己,他們只是感情好局蚀,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布麦锯。 她就那樣靜靜地躺著,像睡著了一般琅绅。 火紅的嫁衣襯著肌膚如雪扶欣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音料祠,去河邊找鬼骆捧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛髓绽,可吹牛的內(nèi)容都是我干的敛苇。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼顺呕,長吁一口氣:“原來是場噩夢啊……” “哼枫攀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起株茶,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤来涨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后启盛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹦掐,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年驰徊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笤闯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡棍厂,死狀恐怖颗味,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情牺弹,我是刑警寧澤浦马,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站张漂,受9級特大地震影響晶默,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜航攒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一磺陡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漠畜,春花似錦币他、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瘾敢,卻和暖如春拍冠,著一層夾襖步出監(jiān)牢的瞬間尿这,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工庆杜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留射众,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓欣福,卻偏偏與公主長得像责球,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子拓劝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348