廢話不多說,直接看代碼。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
RequestHandler requestHandler = new RequestHandler(super.getRequest(),super.getResponse()); //獲取token //兩小時內有效,兩小時后重新獲取 Token = requestHandler.GetToken(); //更新token 到應用中 requestHandler.getTokenReal(); System.out.println("微信支付獲取token=======================:" +Token); //requestHandler 初始化 requestHandler.init(); requestHandler.init(appid,appsecret, appkey,partnerkey, key); |
代碼:本地系統生成訂單
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
// 設置package訂單參數 SortedMap<String, String> packageParams = new TreeMap<String, String>(); packageParams.put( "bank_type" , "WX" ); // 支付類型 packageParams.put( "body" , "xxxx" ); // 商品描述 packageParams.put( "fee_type" , "1" ); // 銀行幣種 packageParams.put( "input_charset" , "UTF-8" ); // 字符集 packageParams.put( "notify_url" , "http://xxxx.com/xxxx/wxcallback" ); // 通知地址 這里的通知地址使用外網地址測試,注意 80 端口是否打開。 packageParams.put( "out_trade_no" , no); // 商戶訂單號 packageParams.put( "partner" , partenerid); // 設置商戶號 packageParams.put( "spbill_create_ip" , super .getRequest().getRemoteHost()); // 訂單生成的機器IP,指用戶瀏覽器端IP packageParams.put( "total_fee" , String.valueOf(rstotal)); // 商品總金額,以分為單位 // 設置支付參數 SortedMap<String, String> signParams = new TreeMap<String, String>(); signParams.put( "appid" , appid); signParams.put( "noncestr" , noncestr); signParams.put( "traceid" , PropertiesUtils.getOrderNO()); signParams.put( "timestamp" , timestamp); signParams.put( "package" , packageValue); signParams.put( "appkey" , this .appkey); // 生成支付簽名,要采用URLENCODER的原始值進行SHA1算法! String sign = "" ; try { sign = Sha1Util.createSHA1Sign(signParams); } catch (Exception e) { e.printStackTrace(); } // 增加非參與簽名的額外參數 signParams.put( "sign_method" , "sha1" ); signParams.put( "app_signature" , sign); // api支付拼包結束------------------------------------ //獲取prepayid String prepayid = requestHandler.sendPrepay(signParams); System.out.println( "prepayid :" + prepayid); |
代碼:生成預付快訂單完成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
//生成預付快訂單完成,返回給android,ios 掉起微信所需要的參數。 SortedMap<String, String> payParams = new TreeMap<String, String>(); payParams.put( "appid" , appid); payParams.put( "noncestr" , noncestr); payParams.put( "package" , "Sign=WXPay" ); payParams.put( "partnerid" , partenerid); payParams.put( "prepayid" , prepayid); payParams.put( "appkey" , this .appkey); //這里除1000 是因為參數長度限制。 int time = ( int ) (System.currentTimeMillis() / 1000 ); payParams.put( "timestamp" ,String.valueOf(time)); System.out.println( "timestamp:" + time); //簽名 String paysign = "" ; try { paysign = Sha1Util.createSHA1Sign(payParams); } catch (Exception e) { e.printStackTrace(); } payParams.put( "sign" , paysign); //拼json 數據返回給客戶端 BasicDBObject backObject = new BasicDBObject(); backObject.put( "appid" , appid); backObject.put( "noncestr" , payParams.get( "noncestr" )); backObject.put( "package" , "Sign=WXPay" ); backObject.put( "partnerid" , payParams.get( "partnerid" )); backObject.put( "prepayid" , payParams.get( "prepayid" )); backObject.put( "appkey" , this .appkey); backObject.put( "timestamp" ,payParams.get( "timestamp" )); backObject.put( "sign" ,payParams.get( "sign" )); String backstr = dataObject.toString(); System.out.println( "backstr:" + backstr); return backstr; |
到此為止,預付款訂單已生成,并且已返回客戶端,坐等微信服務器通知,通知的地址就是生成預付款訂單的notify_url
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
ResponseHandler resHandler = new ResponseHandler(request, response); resHandler.setKey(partnerkey); //創建請求對象 //RequestHandler queryReq = new RequestHandler(request, response); //queryReq.init(); if (resHandler.isTenpaySign() == true ) { //商戶訂單號 String out_trade_no = resHandler.getParameter( "out_trade_no" ); System.out.println( "out_trade_no:" + out_trade_no); //財付通訂單號 String transaction_id = resHandler.getParameter( "transaction_id" ); System.out.println( "transaction_id:" + transaction_id); //金額,以分為單位 String total_fee = resHandler.getParameter( "total_fee" ); //如果有使用折扣券,discount有值,total_fee+discount=原請求的total_fee String discount = resHandler.getParameter( "discount" ); //支付結果 String trade_state = resHandler.getParameter( "trade_state" ); //判斷簽名及結果 if ( "0" .equals(trade_state)) { //------------------------------ //即時到賬處理業務開始 //------------------------------ System.out.println( "----------------業務邏輯執行-----------------" ); //——請根據您的業務邏輯來編寫程序(以上代碼僅作參考)—— System.out.println( "----------------業務邏輯執行完畢-----------------" ); System.out.println( "success" ); // 請不要修改或刪除 System.out.println( "即時到賬支付成功" ); //給財付通系統發送成功信息,財付通系統收到此結果后不再進行后續通知 resHandler.sendToCFT( "success" ); //給微信服務器返回success 否則30分鐘通知8次 return "success" ; } else { System.out.println( "通知簽名驗證失敗" ); resHandler.sendToCFT( "fail" ); response.setCharacterEncoding( "utf-8" ); } } else { System.out.println( "fail -Md5 failed" ); } |
以上就是java實現微信支付服務端所要提供的代碼,希望大家仔細研究,實現微信支付。