微信支付

微信公眾號支付分為三類

以下主要介紹公眾號H5授權支付

首先看一下微信支付的業(yè)務邏輯

大部分微信支付邏輯在于服務器和微信服務器之間的信息驗證,對于SPringMVC框架開發(fā),可以使用ajax來進行業(yè)務處理,H5頁面相應立刻購買按鈕事件,傳遞下單信息,服務器收到信息后整合統(tǒng)一下單信息,發(fā)往微信服務器獲取預支付碼,返回H5頁面調起支付驗證,通過H5微信支付框架JSAPI異步獲取支付結果

邏輯開發(fā)前階段:設計統(tǒng)一下單實體類,設計隨機數(shù)算法、簽名算法、實體類XML格式轉換算法等工具類(建議用微信SDK下的WXPayUtil),HTTP請求實現(xiàn)類


第一步:獲取訂單信息,轉換微信統(tǒng)一訂單

微信統(tǒng)一訂單

接口鏈接

URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder

請求參數(shù)

appid? 微信支付分配的公眾賬號ID(企業(yè)號corpid即為此appId) 例:wxd678efh567hg6787

mch_id? 微信支付分配的商戶號? 例:1230000109

device_info? 自定義參數(shù),可以為終端設備號(門店號或收銀設備ID),PC網(wǎng)頁或公眾號內支付可以傳"WEB"? 例:WEB 或 013467007045764

nonce_str? 隨機字符串,長度要求在32位以內。推薦隨機數(shù)生成算法? 例:5K8264ILTKCH16CQ2502SI8ZNMTM67VS

body? 商品簡單描述,該字段請按照規(guī)范傳遞? 例:騰訊充值中心-QQ會員充值

sign? 通過簽名算法計算得出的簽名值,詳見下面簽名生成算法? 例:C380BEC2BFD727A4B6845133519F3AD6

sign_type? 簽名類型,默認為MD5,支持HMAC-SHA256和MD5? 例:MD5

out_trade_no? 商戶系統(tǒng)內部訂單號,要求32個字符內,只能是數(shù)字、大小寫字母_-|*@ ,且在同一個商戶號下唯一? 例:20150806125346

fee_type? 符合ISO 4217標準的三位字母代碼,默認人民幣:CNY? 例:CNY

total_fee? 訂單總金額,單位為分? 例:88

time_start? 訂單生成時間,格式為yyyyMMddHHmmss,如2009年12月25日9點10分10秒表示為20091225091010? 例:20091225091010

notify_url? 異步接收微信支付結果通知的回調地址,通知url必須為外網(wǎng)可訪問的url,不能攜帶參數(shù)? 例:http://www.weixin.qq.com/wxpay/pay.php

trade_type? 取值如下:JSAPI,NATIVE,APP等? 例:JSAPI

openid? 用戶標識,trade_type=JSAPI時(即公眾號支付),此參數(shù)必傳,此參數(shù)為微信用戶在商戶對應appid下的唯一標識。openid如何獲取請參考獲取微信openId? 例:oUpF8uMuAJO_M2pxb1Q9zNjWeS6o

微信支付參數(shù)眾多,在此不統(tǒng)一舉例,詳情參考微信官方文檔

appid為申請微信公眾號時獲取到的公眾號id,mch_id為申請微信支付時獲取的商戶號id,device_info由于我們主要開發(fā)公眾號支付此值為WEB,sign_type為簽名類型本文主要使用MD5,trade_type為交易類型公眾號指定為JSAPI,fee_type 人民幣默認CNY。

body 需要根據(jù)實際業(yè)務訂單信息來拼接,用于微信支付時顯示支付商品內容

nonce_str 為隨機字符串用于刷新sign簽名,保證每次簽名都是異于其他簽名,隨機字符串算法推薦使用微信工具包中的工具類WXPayUtil.generateNonceStr()獲取,也可使用java隨機生成UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32);

out_trade_no 商戶訂單號用于識別支付訂單,唯一,避免商品重疊導致支付失敗

total_fee? 訂單總金額,單位為分,88為0.88元,建議使用int類型

time_start? 訂單時間,建議使用H5調起支付時的系統(tǒng)時間System.currentTimeMillis()/1000;,時間單位:秒

notify_url? 為支付成功后回調路徑,也可以再H5頁面中后續(xù)控制

了解完參數(shù)情況,根據(jù)業(yè)務需要創(chuàng)建統(tǒng)一訂單的實體類,方便后續(xù)調用

當用戶點擊立即購買的按鈕時,我們將業(yè)務邏輯中的訂單信息轉換成微信統(tǒng)一訂單,在服務器端獲取統(tǒng)一訂單信息


第二步:驗證訂單信息獲取預支付id(prepay_id)

獲取預支付id需要將統(tǒng)一訂單信息打包發(fā)給微信服務器驗證,驗證通過后會返回相關數(shù)據(jù)包

URL地址? https://api.mch.weixin.qq.com/pay/unifiedorder

將統(tǒng)一下單信息轉成XML格式,推薦使用WXPayUtil.generateSignedXml(map, payKey)已經(jīng)封裝簽名算法

String xml = WXPayUtil.generateSignedXml(map, payKey);? ? ? ?

String response = new HttpConnection().post(unifiedOrderUrl, xml);

MapresponseMap = WXPayUtil.xmlToMap(response);

String prepay_id = responseMap.get("prepay_id");

簽名算法

第一步,設所有發(fā)送或者接收到的數(shù)據(jù)為集合M,將集合M內非空參數(shù)值的參數(shù)按照參數(shù)名ASCII碼從小到大排序(字典序),使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特別注意以下重要規(guī)則:

◆ 參數(shù)名ASCII碼從小到大排序(字典序);

◆ 如果參數(shù)的值為空不參與簽名;

◆ 參數(shù)名區(qū)分大小寫;

◆ 驗證調用返回或微信主動通知簽名時,傳送的sign參數(shù)不參與簽名,將生成的簽名與該sign值作校驗。

◆ 微信接口可能增加字段,驗證簽名時必須支持增加的擴展字段

第二步,在stringA最后拼接上key得到stringSignTemp字符串,并對stringSignTemp進行MD5運算,再將得到的字符串所有字符轉換為大寫,得到sign值signValue。

◆ key設置路徑:微信商戶平臺(pay.weixin.qq.com)-->賬戶設置-->API安全-->密鑰設置

舉例:

第一步:對參數(shù)按照key=value的格式,并按照參數(shù)名ASCII字典序排序如下:

第二步:拼接API密鑰:

最終得到最終發(fā)送的數(shù)據(jù):

發(fā)送XML數(shù)據(jù)包時,注意參數(shù)除必填項以外,可不封裝不必需參數(shù),請勿參數(shù)傳空值,會報參數(shù)值錯誤

XML數(shù)據(jù)包需包含用戶openId及API秘鑰(申請認證微信支付時設置的API密碼)

成功獲取到prepay_id后進行微信支付H5調起支付驗證


第三步:H5網(wǎng)頁調起支付API

服務器后臺封裝微信支付信息數(shù)據(jù),ajax返回數(shù)據(jù),H5起調微信支付JSAPI,使用WeixinJSBridge.invoke發(fā)起支付驗證

參數(shù)

appId? 公眾號id

timeStamp? 時間戳

nonceStr? 隨機字符串

package? 預支付碼,格式:prepay_id=Re6s********89HS

signType? 微信簽名類型,MD5

paySign? 微信簽名,詳情參照簽名算法


返回結果

根據(jù)不同返回值處理不同的邏輯

最后貼一張官方文檔的說明圖,解釋下appid,mch_id,API密鑰,Appsecret區(qū)別


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 引言 秋高氣爽,天氣轉涼,正是學習工作做的好時候。(~ ̄▽ ̄)~~(~ ̄▽ ̄)~ 我是個phper最近在寫微信支付...
    恩就是這個名閱讀 8,222評論 2 15
  • 準備工作: 需要公司的營業(yè)執(zhí)照,稅務信息,等老板的身份證信息等,我記得,用這些材料,去支付寶注冊一個商家賬戶(審核...
    Hevin_Chen閱讀 6,872評論 0 9
  • 自己總結的微信支付寶支付流程和注意點: 準備工作: 需要公司的營業(yè)執(zhí)照,稅務信息,等老板的身份證信息等,我記得,用...
    Www劉閱讀 18,679評論 2 50
  • 一、背景介紹 作為一名Android開發(fā),從最初的跌跌撞撞到現(xiàn)在小有所悟,這其中經(jīng)歷過的辛酸苦辣也是一種痛并快樂著...
    freecats08閱讀 5,139評論 7 54
  • 找不到合適的人內推360,所以直接就校招了。 筆試 40道選擇題外加兩道編程題,做的真的夠嗆了。40題選擇中包含大...
    RAUL_AC閱讀 478評論 0 0

友情鏈接更多精彩內容