Java 關於微信公衆號支付總結附代碼

不少朋友第一次作微信支付的時候都有蒙,但當你完整的作一次就會發現其實並無那麼難php

業務流程和應用場景官網有詳細的說明:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_4,我就不作具體介紹了,我主要介紹一下做爲開發的咱們須要作的事情,微信官網要完成的部分咱們就先不要考慮了html

開發流程:

  1.獲取用戶受權,有兩種形式:java

  一種是snsapi_base (不彈出受權頁面,直接跳轉,只能獲取用戶openid);另外一種是:snsapi_userinfo (彈出受權頁面,可經過openid拿到暱稱、性別、所在地。而且, 即便在未關注的狀況下,只要用戶受權,也能獲取其信息 ) 算法

  2.調用統一下單接口獲取預支付ID;(重點)api

  3.H5調起微信支付的內置JS安全

  4.支付完成後,微信回調的處理,這裏主要就是處理支付成功後本身項目的業務邏輯微信

獲取統一下單接口所需參數:

  所需參數去哪裏找其實官方也有具體說明:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1app

  appid:微信支付分配的公衆帳號ID(企業號corpid即爲此appId) 登錄微信公衆號後臺==>開發==>基本配置微信公衆平臺

  mch_id : 微信支付分配的商戶號 ;  登錄位置公衆號支付後臺就能夠看到異步

  device_info :設備號;能夠爲終端設備號(門店號或收銀設備ID) PC網頁或公衆號內支付能夠傳"WEB"   

  nonce_str:隨機字符串,長度要求在32位之內;本身隨機生成就行

    小科普一下:nonce=Number once 表示在密碼學中Nonce是一個只被使用一次的任意或非重複的隨機數值

  sign:簽名,官方詳細描述:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3;

    這是小白們常常栽跟頭的地方,不過不用擔憂,下面我會附上前面算法

  sign_type:簽名類型,默認爲MD5,支持HMAC-SHA256和MD5。

  body:商品簡單描述信息,自定義便可

  out_trade_no:商戶系統內部訂單號,要求32個字符內,只能是數字、大小寫字母_-|* 且在同一個商戶號下惟一;

  total_fee:訂單總金額,注意單位爲分 

  spbill_create_ip:終端IP;APP和網頁支付提交用戶端ip

  notify_url:回調函數的通知地址,異步接收微信支付結果通知的回調地址,通知url必須爲外網可訪問的url,不能攜帶參數,就是本身處理支付完業務的接口路徑

  trade_type:交易類型,JSAPI 公衆號支付;NATIVE 掃碼支付;APP APP支付

  key  :密鑰,簽名時用,key設置路徑:微信商戶平臺(pay.weixin.qq.com)-->帳戶設置-->API安全-->密鑰設置

  最方面的就是本身想了一個字符串,而後用MD5(其餘加密方式也能夠)加密成32位的字符串,從新設置。

調用統一下單接口:

  所須要的參數簽名已經都有具體介紹了,這裏我就直接上代碼了

SortedMap<Object,Object> packageParams = new TreeMap<Object,Object>();
        packageParams.put("appid", appid);
        packageParams.put("mch_id", mch_id);
        packageParams.put("device_info", "WEB");
        packageParams.put("body", "自定義描述信息");
        packageParams.put("out_trade_no","商戶系統內部訂單號");
        packageParams.put("total_fee","支付金額");
        packageParams.put("spbill_create_ip", "終端IP");
        packageParams.put("notify_url","回調地址url");
        packageParams.put("trade_type","JSAPI");
        packageParams.put("nonce_str", "隨機字符串");
        packageParams.put("sign","簽名結果");

  統一下單接口地址:https://api.mch.weixin.qq.com/pay/unifiedorder

  準備好數據後,封裝成XML,調起統一下單接口,會返回一個XML格式數據 return_code爲SUCCESS時,請求成功,獲取咱們須要的預支付id(prepay_id)這時就已經成功了一大半,能夠稍做休息,犒勞一下本身了。

附上加密算法:傳入上面準備的map數據

		StringBuffer sb = new StringBuffer();
		Set es = parameters.entrySet();
		Iterator it = es.iterator();
		while(it.hasNext()) {
			Map.Entry entry = (Map.Entry)it.next();
			String k = (String)entry.getKey();
			Object v = entry.getValue();
			if(null != v && !"".equals(v) 
					&& !"sign".equals(k) && !"key".equals(k)) {
				sb.append(k + "=" + v + "&");
			}
		}
		sb.append("key=" +密鑰key);
		String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();

H5調起微信支付的內置JS 準備數據:

  此次的字段名和上次準備數據有所不同

  appId:只是I大寫,值仍是同樣的

     nonceStr:隨機字符串,長度要求在32位之內;本身隨機生成就行
        package:統一下單接口返回的prepay_id參數值,提交格式如:prepay_id=***
     timeStamp:時間戳

  signType:簽名方式,默認MD5

  paySign:簽名

 

        SortedMap<Object,Object> packageParams = new TreeMap<Object,Object>();
        packageParams.put("appId","商戶號");
        packageParams.put("timeStamp","時間戳");
        packageParams.put("nonceStr","隨機字符串");
        packageParams.put("prepayid","前面獲得的預支付id");
        packageParams.put("package","prepay_id=前面獲得的預支付id");
        packageParams.put("signType","MD5");
        packageParams.put("paySign","簽名");

 

  若是全部配置都OK,就會彈出請輸入密碼的界面,反之提示目錄未受權,這時候你就應該想時候配置受權目錄了

  微信公衆平臺後臺 ==> 微信支付 ==> 開發者配置,S API網頁支付,而後添加系統後臺的受權目錄

  其餘微信支付配置參考:https://jingyan.baidu.com/article/77b8dc7fef360d6174eab690.html

回調函數處理:

 

    1)解析傳過來的流信息,經過從新簽名的方式驗證流中包含的信息的正確性。就是判斷這個信息究竟是不是微信發的

 

    2)return_code和result_code都是SUCCESS的話,處理商戶本身的業務邏輯。就是訂單的支付狀態啊等一些信息。

 

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

相關文章
相關標籤/搜索