1. 程式人生 > >java後臺對微信支付功能的實現

java後臺對微信支付功能的實現

第一次寫微信小程式後臺介面,卻發現微信小程式有太多太多坑了。所以這裡進行一個記錄,防止忘記。

(現在補更一下,一定要和前端開發人員溝通好返回值啊!!最後一步給前端paySign值,結果前端老是報錯requestPayment:fail parameter error: parameter.paySign should be String instead of Undefined;)————就是說paySign值是個未定義的。害的我苦苦找了一晚上和一早上,怎麼都找不到問題,最後讓對方發了一份他寫的程式碼,我開啟後才發現對方取值是

'paySign': res.data.sign····你們體驗過背了半天的鍋是什麼感覺嗎?'paySign'的值居然用sign取,不報錯才怪啊!

想要作做微信小程式支付功能開發,首先我們要做一個熱身!(新版本已經可以直接獲取使用者OpenID了,所以直接走下面支付流程吧。)

就是獲取Open_Id。在關注者與公眾號產生訊息互動後,公眾號可獲得關注者的OpenID(加密後的微訊號,每個使用者對每個公眾號的OpenID是唯一的。對於不同公眾號,同一使用者的openid不同)。

這個Open_Id是微信小程式呼叫wx.login方法先獲取code,然後將code傳送到後臺,通過訪問:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code


介面來獲取到的Open_Id,如下

/**
	 * 獲取OpenId
	 * 
	 * @param js_code 小程式前端傳送的Code值
	 * @return JSON格式的Open_Id返回值
	 */
	public static JSONObject getOpen_Id(String js_code) {
		JSONObject json = new JSONObject();
		String open_Id = "https://api.weixin.qq.com/sns/jscode2session?appid=wxXXXX2693XXXXXXXe&secret=7f4d62XXXXX2f795815XXXXXXXX&js_code="
				+ js_code + "&grant_type=authorization_code";
		String getOpen_Id = PayUtil.httpRequest(open_Id, "POST", "");
		JSONObject fromObject = JsonUtil.StringtoJSON(getOpen_Id);
		json.put("open_Id", fromObject);
		return fromObject;
	}

按照上面步驟:我們可以獲取到這個openid。

————————————————————————————————————————————

接下來,我們就要開始進行支付操作了。

首先,備忘一下,我先把微信支付會用到的幾個必傳引數記錄一下。

appid:微信的應用ID(固定值),也就是你開發的是什麼微信,就填對應的Id

body:商品描述。

mch_id:微信支付商戶資訊號(固定值),需要提前註冊為i系列商戶。當時沒有註冊,讓我等了兩天稽核才開始動手寫支付。

nonce_str:隨機字串。

notify_url:接收微信支付非同步通知回撥地址,後臺可以接收到微信小程式傳送的訂單訊息,有很多很多訊息。

out_trade_no:商戶內部訂單號,這個我有點不明白,我就當是本地訂單索引發送的。

total_fee:訂單總金額,單位為分

trade_type:交易型別JSAPI 公眾號支付 NATIVE 掃碼支付APP APP支付

openid:使用者唯一標識,就是我上面獲取到的那個值,現在要用了。

attach:附加資料,這個是我後面才加入的,我上傳的Deom沒有加入,你們需要的話可以新增進去,因為這個涉及到獲取訂單返回值的某些問題...

除了上面的這幾個必傳參外,涉及到小程式支付的還有一個特殊的必傳參和一個固定值。

Key:商戶祕鑰。(固定值)生成後儲存起來,以後用處大著。

sign:簽名。獲取上面的必傳引數,然後將其轉化為<xml>格式,然後加上key值,通過特定演算法,生成的sign簽名。

反正我就用了這麼幾行程式碼和Demo裡的一些工具方法。完成了微信支付的二次簽名

//微信的應用ID(固定值)
	public final  static String appid="wx1eXXXXXXXXXXXe";
	//微信商號(固定值)
	public final static String mch_id="1XXXXXXXXXX81";
	//付費方法型別(固定值)
	public final static String trade_type="JSAPI";
	//商戶金鑰(固定值)
	public final static String key="311XXXXXXXXXXXXXXXXXXXa9";
	//統一下單API介面連結  (固定值)
	public final static String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
	
	

	/**
	 * 微信支付呼叫介面
	 * @param request
	 * @return JSON形式的引數值
	 * @throws UnsupportedEncodingException
	 */
	 public static JSONObject wxOnePay(JSONObject param_json,String price) throws UnsupportedEncodingException {
		 Map<String,String> m=new HashMap<String,String>();		
			try {
				String price1=Integer.toString((int)((Double.parseDouble(price)*100)));
				System.out.println("價格是:"+price1+"分");
				String notify_url="http://baidu.com/";//寫你們自己的回撥地址
				//將獲取到的map值轉換為xml格式
				m.put("appid", PayUtil.appid);//微信的應用ID(固定值)
				m.put("body",param_json.getString("body") );//商品描述(其實可有可無)
				m.put("mch_id", PayUtil.mch_id);//微信支付商戶資訊號(固定值)
				m.put("nonce_str",PayUtil.getRandomNumbers());//隨機字串,不長於32位
				m.put("notify_url",notify_url);//接收微信支付非同步通知回撥地址,通知url必須為直接可訪問的url,不能攜帶引數。				
				m.put("out_trade_no",PayUtil.getRandomNumbers());//商戶系統內部的訂單號(咱們沒有做,所以可不填),32個字元內、可包含字母
				m.put("total_fee",price1);//訂單總金額,單位為分
				m.put("trade_type", PayUtil.trade_type);//固定值
				m.put("openid", param_json.getString("openid"));//微信端下的唯一使用者標識
				Map<String,String> sPara = PayUtil.paraFilter(m);
				String prestr = PayUtil.createLinkString(sPara);
				String mysign = PayUtil.sign(prestr, PayUtil.key, "utf-8").toUpperCase();   
				m.put("sign", mysign);//sign簽名,第一次隨機簽名
				//打包要傳送的xml   
		        String respXml = PayUtil.getRequestXML(m);
		        //發起伺服器請求
		        String result =PayUtil.httpRequest(PayUtil.url, "POST", respXml);
		        Map<?,?> map = PayUtil.doXMLParse(result);
		        //返回狀態碼  
				String return_code = (String) map.get("return_code");
				//返回給小程式端需要的引數  
				 Map<String, String> callbackMap = new HashMap<String, String>();
				if(return_code=="SUCCESS"||return_code.equals(return_code)) {
					//返回的預付單資訊 
					String prepay_id = (String) map.get("prepay_id");
		            Long timeStamp = System.currentTimeMillis() / 1000;//微信是按照分來算的,我們是按照元來算的,所以需要轉換
		            callbackMap.put("appId", PayUtil.appid);
		            callbackMap.put("timeStamp", timeStamp+ "");
		            callbackMap.put("nonceStr",notify_url); 
		            callbackMap.put("signType", "MD5");	  
		            callbackMap.put("package", "prepay_id="+prepay_id);	           
		            Map<String,String> sPara2 = PayUtil.paraFilter(callbackMap);
					String prestrTow = PayUtil.createLinkString(sPara2);
					String mysignTow = PayUtil.sign(prestrTow, PayUtil.key, "utf-8").toUpperCase();  
					//sign簽名,第二次隨機簽名
					callbackMap.put("paySign", mysignTow);
					JSONObject jsonObject = JSONObject.fromObject(callbackMap);
					String respXml2 = PayUtil.getRequestXML(callbackMap);
					Log4jUtil.infoLog("CaseController getDetailsCase()").info("傳遞的引數:" + respXml2);
					return jsonObject;
				}			
			} catch (Exception e) {
				Log4jUtil.infoLog("PayUtil wxOnePay()").error("微信支付工具出錯!:"+e);
				e.printStackTrace();
				return null;
			}
			return null;
	 	}

生成簽名的Deom和相關工具類文件:

輸入正確的引數和呼叫工具類中對應的方法,正常情況下,你們的微信支付就已經完成。

——————————————————————————————————————————

接下來就是無(磨)關(人)緊(妖)要(精)的訂單管理了。當然你們可以時情況而定,

因為觸發資金流之後,微信商戶平臺就會自動記錄訂單資訊,你們家產品狗好說話,可以讓甲方直接去商戶平臺看吧。

如果不可以,你的notify_url引數就派上用場了。

微信支付發生,不管成功與否,微信平臺都會非同步傳送訊息到你的回撥介面當中。

使用上面提供的工具類的

PayUtil.doXMLParse(data)方法。將接收的data值傳進去,自動改為MAP格式,到時候你只要按照KEY取微信的回撥值就可以了。

至此,小程式的支付功能算是全部走完。

相關推薦

java後臺支付功能實現

第一次寫微信小程式後臺介面,卻發現微信小程式有太多太多坑了。所以這裡進行一個記錄,防止忘記。(現在補更一下,一定要和前端開發人員溝通好返回值啊!!最後一步給前端paySign值,結果前端老是報錯requestPayment:fail parameter error: para

spring boot項目之支付功能實現詳細介紹

tab 流程 invalid body 正方形 無法 數據 fmt -s 對接微信支付功能主要有以下幾個步驟, 而其第一個關鍵點就是獲取OpenID,在這裏介紹兩種獲取方式: 一、微信授權 微信網頁授權 如果用戶在微信客戶端中訪問第三方網頁,公

小程序 使用支付功能實現在線支付訂單

navi order lose ray 如果 image 全部 extern base 以前做過PC頁面微信支付,但是這次在小程序 直接調用微信支付功能還是方便很多 先放個微信官方API鏈接:https://pay.weixin.qq.com/wiki/doc/api/wx

支付功能實現

< view class= "container"> < input type= "text" bindinput= "getOrderCode" style= "border:1px solid #ccc;"

java服務端,支付功能實現

     接入微信的支付功能在java服務端,現在記錄下來這個過程,方便以後用到。程式碼都是參考網路,功能可以實現      實際參考https://github.com/wxpay/WXPay-SDK-Java     ①,寫一個介面,作為引數配置的介面,當然也可以不用介

【轉】小程序實現支付功能(可用)

arr 必須 enc red use sam func 結束 單表 原博: https://blog.csdn.net/fredrik/article/details/79697963 微信小程序實現微信支付功能 直接把裏面的參數替換成你的就

PHP實現 APP端支付功能

1.我封裝好的一個支付類檔案,多餘的東西都去除掉了,並且把配置引數放到了這個支付類中,只需要修改Weixinpayandroid方法內的幾個引數就可以直接複製使用: class Wxpayandroid { //引數配置 public $config = array( 'appid' =&

小程式:web-view巢狀H5實現支付功能解決方案及填坑

最近一個多月加班比較嚴重,偶爾休息一天也是在補睡眠+陪家人,比較長時間沒有來進行總結記錄了。今天不加班,開始為這段時間做的東西進行下經驗總結。 這段時間因為公司需要,接觸了一些.Net前後臺開發,慢慢了解了一些WCF、H5站點、WebService、Soap、Linq等,也

Java支付功能分享

微信支付越來越成為電商們熱衷的支付方式,微信官方也給分享了微信支付的原始碼,但缺少詳細的指引,對於新手來說會浪費大量的時間。 本場 Chat 主要適用於有微信支付需求但未進行過微信支付開發的開發者們,以案例的形式詳細的講述微信支付的整個流程,參與活動我會給大夥分享可以跑通 Java 原始碼,只需修

小程式實現支付功能

這裡我直接上程式碼,附有註釋,直接把我的程式碼貼上一下就可以用了,也是自己走了好多的彎路。。,寫在部落格裡做個記錄直接把裡面的引數替換成你的就可以了,前提是你要開通的有微信支付功能,需要商戶號,appid,appsecret,openid,openid的獲取比較簡單,我再寫一

java--spring boot支付服務端實現含程式碼(app支付、掃碼支付等)

最近在弄支付寶、微信支付等的事,發現這兩家的文件都寫得很差,demo也讓人看的雲裡霧裡。所以寫篇部落格,來儘量減少後來的同學走的彎路。 首先,若是要做app支付的話,在微信第三方平臺申請APP,若是安卓的話上傳你的keystore和包名,ios上傳bundle id,微信會

PHP實現支付功能開發+例項程式碼

namespace Wechat\Controller; use Think\Controller; /** * 父類控制器,需要繼承 * @file ParentController.class.php * @author Gary <[email protected]> *

快速實現支付功能

首先去支付寶開發平臺申請支付接入功能,並且填寫正確的包名和APP簽名 1,包名直接在Androidmainfest中檢視   package="com.company.demo"; 2,APP簽名可以用騰訊開發平臺的簽名生成工具Gen_Signature_Android.a

java支付HTTPS伺服器證書更新進行後當前伺服器是否可用驗證

收到了這樣的一個通知:微信支付HTTPS伺服器證書的根證書將於2018-08-23日到期,微信支付計劃於2018-05-29日更換伺服器證書。請通知貴司技術開發人員儘快完成相關驗證,確保安裝新的根

H5調起支付功能

需要 con 返回 alert list 訂單 團隊 eve window 第一步:需要後端返回需要的以下參數: 該操作是你提交完訂單信息後在接口所返回的json, 其次將其存儲起來,我用的localStorage var payParams = {

支付:手機系統自帶的瀏覽器,調用支付如何實現(非掃碼)

所有 價格 驗證 返回 調用 -i 是否為空 支付申請 data- Q:翻看了微信支付的api沒發現支持h5調支付接口的情況(微信js除外),然後卻發現美團的支付成功調用了,這是怎麽實現的? A: 使用微信H5支付即可。H5支付通過URL調起微信APP,

支付功能

and ini edm this substring pac pfx inpu code js wx.request({ url: url + ‘/team!jfchongzhi.action?openid=‘ + openid + ‘&weibi

公眾號服務號如何開通支付功能

開通微信商戶支付平臺 當我們的公眾號認證完成之後,就可以正常使用了,擔憂有很多地方我們就需要用到微信支付了,例如微信商城,拼團的線上支付等等場景。而且現在微信的使用場景非常廣泛,基本上每個人都會攜帶手機且使用微信,所以商戶開通微信支付可以更好的為顧客服務:(只有服務號可以申請微信支付,每個訂閱號有一次機會升

Java專案呼叫支付到指定銀行卡

public static EnterpriceToCustomer WXPayToBC(String encBankAcctNo, String encBankAcctName, String bank_code, String desc, String amount) throws Ex

公眾號支付java開發,支付簽名錯誤,或者一直請求回撥方法問題

本編為原創,如需轉載,請註明出處。 微信支付開發過程中,如果沒有遇到簽名錯誤這個問題或者一直請求回撥方法問題,那麼感覺你開發了一個假對接,網上也有許多列子,以及官網也有微信團隊demo,但是還是有解決不了的各種簽名問題,demo需要手動修改因為他的加密方式會不盡如人意,還有排序問題。好了,話