本文為學習記錄weixin-java-tools實現(xiàn)公眾號微信支付.
碼云地址:點我
// 授權(quán)登錄用到 <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-mp</artifactId> <version>3.1.0</version> </dependency>
// 微信支付用到 <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-pay</artifactId> <version>3.1.0</version> </dependency>
授權(quán)登錄官方 api:點我
個人理解的授權(quán)登錄流程:引導用戶點擊喚起授權(quán)登錄的地址,打開頁面后攜帶微信返回的code參數(shù);使用code參數(shù)獲取AccessToken;獲取用戶數(shù)據(jù)。
引導客戶打開授權(quán)登錄地址后,攜帶code跳轉(zhuǎn)到指定頁面在指定頁面調(diào)用方法:
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("用戶數(shù)據(jù)不存在"); } return Result.success(wxMpUser); } catch (WxErrorException e) { e.printStackTrace(); log.info("授權(quán)異常:{}", e); return Result.error("授權(quán)登錄失敗"); } catch (Exception e) { e.printStackTrace(); return Result.error("登錄失敗"); } }前端保存下用戶信息就完事了。
個人理解的微信支付流程:用戶頁面點擊<微信支付>按鈕 后端調(diào)用 <微信統(tǒng)一下單> 統(tǒng)一下單返回參數(shù) ,前端使用 <統(tǒng)一下單>返回的參數(shù)喚起微信支付。
商戶中需要在api安全中設置很多東西... 就不一一贅述了
微信支付官方api 前端:點我
后端api點我
商戶登錄地址 點我
public Result pay(Long orderNo, HttpServletRequest request) { //查詢訂單信息 Order order = orderService.findByOrderNo(orderNo); try { WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest(); //獲取當前用戶 UserInfo userInfo = RequestContextHolderUtil.getUserInfo(); orderRequest.setBody("支付內(nèi)容的說明"); //商戶號 orderRequest.setMchId(mchId); orderRequest.setAttach("xxx公司"); orderRequest.setOutTradeNo(orderNo.toString()); orderRequest.setTotalFee(BaseWxPayRequest.yuanToFen(order.getPayment().toString()));//元轉(zhuǎn)成分 orderRequest.setOpenid(userInfo.getOpenId()); orderRequest.setSpbillCreateIp(HttpUtils.getIp(request)); //我這里是微信公眾號內(nèi)打開的h5頁面 type使用 JSAPI 根據(jù)業(yè)務場景變更 orderRequest.setTradeType(WxPayConstants.TradeType.JSAPI); // 支付成功后跳轉(zhuǎn)頁面 這里需要對url進行編碼 orderRequest.setNotifyUrl("http://xxxxxxxxx"); orderRequest.setAppid(appId); // 調(diào)用sdk提供的統(tǒng)一下單方法 createOrder會返回重新組裝后的對象 建議使用這個 Object unOrder = wxService.createOrder(orderRequest); // 這個可能是偏向原生一點的統(tǒng)一下單,返回的參數(shù)有很多沒用的 或者null值 建議使用 createOrder下單 // wxService.unifiedOrder(orderRequest); return Result.success(unOrder); } catch (Exception e) { log.error("微信支付失敗!訂單號:{},原因:{}", orderNo, e.getMessage()); e.printStackTrace(); return Result.error("支付失敗,請稍后重試!"); } }
新聞熱點
疑難解答