使用weixin-java-tools完成微信授權登錄、微信支付的示例


本文為學習記錄weixin-java-tools實現公眾號微信支付.

碼雲地址:點我

前端精品教程:百度網盤下載

?
1
2
3
4
5
6
// 授權登錄用到
< dependency >
   < groupId >com.github.binarywang</ groupId >
   < artifactId >weixin-java-mp</ artifactId >
   < version >3.1.0</ version >
</ dependency >
?
1
2
3
4
5
6
// 微信支付用到
< dependency >
   < groupId >com.github.binarywang</ groupId >
   < artifactId >weixin-java-pay</ artifactId >
   < version >3.1.0</ version >
</ dependency >

授權登錄官方 api:點我

個人理解的授權登錄流程:引導用戶點擊喚起授權登錄的地址,打開頁面后攜帶微信返回的code參數;使用code參數獲取AccessToken;獲取用戶數據。

引導客戶打開授權登錄地址后,攜帶code跳轉到指定頁面在指定頁面調用方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public Result getAccessToken( @RequestParam (name = "code" ) String code, HttpServletRequest request, HttpServletResponse response) {
     if (StringUtils.isBlank(code)) {
       return Result.error( "code不存在" );
     }
     try {
       WxMpOAuth2AccessToken wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);
       String accessToken = wxMpOAuth2AccessToken.getAccessToken();
       // 獲取用戶微信賬戶信息
       WxMpUser wxMpUser = wxMpService.getUserService().userInfo(wxMpOAuth2AccessToken.getOpenId());
       if (StringUtils.isBlank(wxMpUser.getOpenId())) {
         return Result.error( "用戶數據不存在" );
       }
       return Result.success(wxMpUser);
     } catch (WxErrorException e) {
       e.printStackTrace();
       log.info( "授權異常:{}" , e);
       return Result.error( "授權登錄失敗" );
     } catch (Exception e) {
       e.printStackTrace();
       return Result.error( "登錄失敗" );
     }
   }

前端保存下用戶信息就完事了。

個人理解的微信支付流程:用戶頁面點擊<微信支付>按鈕 后端調用 <微信統一下單> 統一下單返回參數 ,前端使用 <統一下單>返回的參數喚起微信支付。

商戶中需要在api安全中設置很多東西... 就不一一贅述了 

微信支付官方api 前端:點我

后端api點我

商戶登錄地址 點我

前端精品教程:百度網盤下載

?
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
public Result pay(Long orderNo, HttpServletRequest request) {
     
     //查詢訂單信息
     Order order = orderService.findByOrderNo(orderNo);
 
     try {
       WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
       //獲取當前用戶
       UserInfo userInfo = RequestContextHolderUtil.getUserInfo();
       orderRequest.setBody( "支付內容的說明" );
       //商戶號
       orderRequest.setMchId(mchId);
       orderRequest.setAttach( "xxx公司" );
       orderRequest.setOutTradeNo(orderNo.toString());
       orderRequest.setTotalFee(BaseWxPayRequest.yuanToFen(order.getPayment().toString())); //元轉成分
       orderRequest.setOpenid(userInfo.getOpenId());
       orderRequest.setSpbillCreateIp(HttpUtils.getIp(request));
       //我這里是微信公眾號內打開的h5頁面 type使用 JSAPI 根據業務場景變更
       orderRequest.setTradeType(WxPayConstants.TradeType.JSAPI);
 
       // 支付成功后跳轉頁面  這里需要對url進行編碼
       orderRequest.setNotifyUrl( "http://xxxxxxxxx" );
       orderRequest.setAppid(appId);
       
       // 調用sdk提供的統一下單方法 createOrder會返回重新組裝后的對象 建議使用這個
       Object unOrder = wxService.createOrder(orderRequest);
       // 這個可能是偏向原生一點的統一下單,返回的參數有很多沒用的 或者null值 建議使用 createOrder下單
       // wxService.unifiedOrder(orderRequest);
       
       return Result.success(unOrder);
     } catch (Exception e) {
       log.error( "微信支付失敗!訂單號:{},原因:{}" , orderNo, e.getMessage());
       e.printStackTrace();
       return Result.error( "支付失敗,請稍后重試!" );
     }
   }

前端js代碼:

前端喚起微信支付的時候可能會出一些問題,這里建議使用 console.log(res.err_desc);輸出錯誤信息 

res.err_msg 只會提示支付失敗... desc會提示一些具體信息

?
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
function onBridgeReady(){
   WeixinJSBridge.invoke(
     'getBrandWCPayRequest' , {
       "appId" : "wx31fd1e1bad23db37" ,   //公眾號名稱,由商戶傳入
       "timeStamp" :wxData.timeStamp,     //時間戳,自1970年以來的秒數
       "nonceStr" :wxData.nonceStr, //隨機串
       "package" :wxData.packageValue,
       "signType" :wxData.signType,     //微信簽名方式:
       "paySign" :wxData.paySign //微信簽名
 
     },
     function (res){
       console.log(res.err_desc)
       if (res.err_msg == "get_brand_wcpay_request:ok" ){
         // 使用以上方式判斷前端返回,微信團隊鄭重提示:
         //res.err_msg將在用戶支付成功后返回ok,但並不保證它絕對可靠。
       }
     });
}
var wxData={};
function pay(orderId){
   $.ajax({
     url: "統一下單方法url" ,
     type: 'get' ,
     data:{orderNo:orderId},
     beforeSend: function (xhr) {
       xhr.setRequestHeader( "token" , $.cookie( "token" ));
     },
     crossDomain: true ,
     success: function (result){
       wxData=result.data;
       if ( typeof WeixinJSBridge == "undefined" ) {
         if (document.addEventListener) {
           document.addEventListener( 'WeixinJSBridgeReady' ,
             onBridgeReady, false );
         } else if (document.attachEvent) {
           document.attachEvent( 'WeixinJSBridgeReady' ,
             onBridgeReady);
           document.attachEvent( 'onWeixinJSBridgeReady' ,
             onBridgeReady);
         }
       } else {
         onBridgeReady();
       }
     }
   });
}

注:商戶中心支付路徑設置 所有調起微信支付的頁面都要在此注冊,否則微信支付會一閃而過。
微信開發工具上可以模擬授權登錄,但是無法模擬微信支付,所以微信支付在微信開發工具上出現的錯誤都不用管,直接拿到真機上去測試!

使用了sdk后的支付和授權還是很方便的,麻煩的是微信方面的一些配置和流程... 很坑。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM