首頁 > Java > java教程 > 主體

微信公眾號支付開發(java)實例詳解

零下一度
發布: 2017-07-19 13:26:20
原創
3880 人瀏覽過

之前公司專案開發中支付是用阿里的支付做的,那叫一個簡單,隨意;悲催的是,現在公司開發了微信公眾號,所以我步入了全是坑的微信支付開發中。 。 。

業務流程:

  這個微信官網說的很詳細的(傳送門:)。

  

  大概的流程就是:使用者點擊一個支付按鈕-->後台處理(其實就是封裝支付必要的資料以及取得prepay_id,然後將它和一些必須參數封裝傳給前台)-->前台接收資料並且調用微信的js處理資料並調用付款-->使用者看到了一個輸入密碼的介面,包含金額等一些資訊-->使用者輸入密碼後出來一個支付成功的頁面,同時微信會回調我們的介面通知我們支付結果(這部分流程都是微信自己完成的,我們不用管)-->返回系統自己的頁面。

開發步驟:

一、設定支付目錄

  這個官方文件寫的很噁心,看的我一頭霧水,真心有點暈。雖然看不懂,但是覺得很厲害的樣子!傳送門:

二、設定授權網域

這2步完成之後,你可以休息一下了,因為巨坑要來了。 。 。

三、商家server呼叫統一下單一介面請求訂單

這是乾啥的?剛開始做的時候一頭霧水,但誰叫人家微信支付團隊nb啊,不整點你不理解的東西,怎能體現出他們的高大上。 。 。不理解,沒關係照著文件做唄

傳送門:,  微信官方給了個參數的詳細說明。看了半天,總結了一下,就是封裝一些必要參數然後去存取這個介面取得資料。以下是幾個常用的參數,直接copy別人的介紹非常詳細:

appid ==應用ID==登陸微信公眾號後台-開發-基本配置
mch_id == 微信支付商家號==登陸微信支付後台,即可看到
device_info==設備號==終端設備號(門店號或收銀設備ID),注意:PC網頁或公眾號內支付請傳" WEB"
body==商品描述==商品或支付單簡要描述(建議剛開始最好傳英文,盡量先別傳漢子,要不之後簽名出問題都沒法查)
trade_type==交易類型==取值如下:JSAPI,NATIVE,APP。我們這裡使用的JSAPI。標題已經說了,是微信公眾號支付。他們的區別,請參考
      ps:JSAPI--公眾號支付、NATIVE--原生掃碼支付、APP--app支付,統一下單接口trade_type的傳參可參考這裡。 MICROPAY--刷卡支付,刷卡支付有單獨的支付接口,不調用統一下單接口
nonce_str==隨機字符串==隨機字符串,不長於32位(參考算法)   
#notify_url==通知位址==接收微信支付非同步通知回呼位址,通知url必須為直接可存取的url,不能攜帶參數。 (這,取個什麼名字好呢。隨便起吧,反正一時半會也用不到)
out_trade_no==商家訂單號==商家系統內部的訂單號碼,32個字元內、可包含字母(參考:)(每次看完微信的官方解釋就更迷茫了,有木有。沒關係,我就傳個1咋了。)
total_fee==總金額= =訂單總金額,單位為分(這個注意一下,我開始沒注意,傳的是0.01,開發麼都用1分錢,然後就悲劇了,看了好多遍才發現單位是分分分)
openid==使用者識別==trade_type=JSAPI,此參數必傳,使用者在商家appid下的唯一識別。 (要是不知道這個從哪裡來的話,沒關係。微信不是給咱寫文件了嗎)
還有最最重要的一個,重要的角色總要在最後登場。
attach==附加數據,在查詢API和支付通知中原樣傳回,可作為自訂參數使用。 (這個我覺得挺有用的,可以用來放業務數據,因為我是在微信回調中處理業務數據的,用這個參數安全無痛)
sign==簽名==官方給的簽名演算法. 。沒看懂,看不太懂,你覺得你看懂了,沒關係,不遇到幾次簽名錯誤,好意思說自己做過微信支付開發嗎(個人推薦開發時候用官方sdk中的工具來做,能省很多麻煩在這裡下載java的API對應的SDK和呼叫範例,裡面工具很全)
說這個sign還有一個更重要的參數。參與簽名的參數。反正我找了好久才找到。 (公司營運申請的微信支付,當我找她要的時候,他的表情是這樣子的。)
key==key設定路徑:微信商家平台(pay.weixin.qq.com) -->帳戶設定-->API安全-->金鑰設定(這個很重要,簽章都用它)

#這部分總結就是,先將資料封裝成map然後透過工具轉換成xml(工具上面提到了,自己回去看),然後透過post請求請求【微信統一下單一介面】,如果sign沒有問題就會回傳一個xml,裡面很多數據,其中我們要的是prepay_id,就是這個參數,然後產生簽名返回到前台,ok這步也完成了。

問題總結(我在這過程中遇到的問題):1(重要)appid與openid必須是匹配的,換句話說就是用戶的openid必須是在當前的公眾號下使用者(我們好幾個公眾號,可能你們不會遇到這個問題,但這很重要,說以第一個說)2

<span style="text-decoration: underline; color: #ff0000">第二步,生成签名并返回到前台</span><span style="color: #ff0000">这个过程中一定要注意参数一定要写对了,大小写,是否有空格,我在这上面掉了一个大坑,界面调用支付时一直闪退,注意.<br><br></span>
登入後複製

四、H5調起微信支付內建的JS

 後台傳回前台的參數中,應包含以下幾項:
appId==這個是不變的==永遠不變
timeStamp==時間戳==規則:。看完仍是一臉迷茫的,沒關係,我們有工具類。

 

nonceStr ==反正我用的跟剛才簽章是同一個隨機字串。理論上不用應該也沒有關係的,勤快的小夥伴可以試試

package==訂單詳情擴展字符串==統一下單接口返回的prepay_id參數值,提交格式如:prepay_id=** *(你猜對了。剛才我們費那麼大力氣,得到到的prepay_id就是在這裡用的)
signType==簽名方式==簽名演算法,暫支持MD5
paySign ==簽名==這個簽名,要重新生成,在後台。使用如上4個參數+一個key(永遠不變)。 (我產生簽章的時間戳記和傳回給前台的時間戳記是timeStamp是同一個。不一樣行不行,木有驗證)
產生paySign的程式碼
##注意:生成prepay_id時appid是小寫的i,生成paySign時,appId是大寫的I,這兩個是不同的
 
如果一切順利的話,就會出現這個頁面
這些都做完了你就可以放鬆一下了
五,微信回調處理
該部分有以下3小步驟

#    1)解析傳過來的流信息,通過重新簽名的方式驗證流中包含的信息的正確性。就是判斷這個訊息到底是不是微信發的

    2)return_code和result_code都是SUCCESS的話,處理商家自己的業務邏輯。就是訂單的支付狀態啊等一些資訊。

    3)告訴微信,我收到你的回傳值了。不用在發了。

話不多說,直接貼程式碼!

public String return_data(HttpServletRequest request, HttpServletResponse response) throws Exception {
        logger.info("微信支付请求回调了");
        String resXml = "";
        Map<String, String> backxml = new HashMap<String, String>();
        InputStream inStream;try {
            inStream = request.getInputStream();
            ByteArrayOutputStream outSteam = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = inStream.read(buffer)) != -1) {
                outSteam.write(buffer, 0, len);
            }
            outSteam.close();
            inStream.close();
            String result = new String(outSteam.toByteArray(), "utf-8");// 获取微信调用我们notify_url的返回信息Map<String, String> map = WXPayUtil.xmlToMap(result);if (map.get("result_code").toString().equalsIgnoreCase("SUCCESS")) {if (WXPayUtil.isSignatureValid(map, PayConfigUtil.API_KEY)) {
                    logger.info("微信支付-签名验证成功");//                    backxml.put("return_code", "SUCCESS");//                    backxml.put("return_msg", "OK");//                    String toXml = WXPayUtil.mapToXml(backxml);//                    response.getWriter().write(toXml);resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";//业务处理开始                   //业务处理结束                }
                BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());out.write(resXml.getBytes());out.flush();out.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }return resXml;
    }
登入後複製
還記得,

三、商家server呼叫統一下單一介面請求訂單 attach參數麼,這裡用來帶業務資料很方便

#

以上是微信公眾號支付開發(java)實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!