成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

spring——微信開發(fā)

蘇丹 / 2048人閱讀

摘要:網頁授權登陸申請公眾號測試號也行申請測試號鏈接申請后得到和配置需要可以外網訪問的域名,沒有的話可以搞個內網穿透開發(fā)使用第三方的進行開發(fā),避免重復造輪子,微信的開發(fā)文檔如下第三方流程構造鏈接,獲取到,拿到配置接口調用跳轉到授權鏈接跳轉鏈接配置

網頁授權登陸 申請公眾號(測試號也行)

申請測試號鏈接


申請后得到appID和appsecret
配置:

需要可以外網訪問的域名,沒有的話可以搞個內網穿透

開發(fā)

使用第三方的SDK進行開發(fā),避免重復造輪子,微信的開發(fā)文檔如下:


第三方SDK
流程:構造鏈接,獲取到AccessToken,拿到openId

配置WxMpServiceImpl

@Component
public class WechatMpConfig {
    @Autowired
    private WechatAccountConfig wechatAccountConfig;

    @Bean
    public WxMpService wxMpService() {
        WxMpService wxMpService = new WxMpServiceImpl();
        wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
        return wxMpService;
    }

    @Bean
    public WxMpConfigStorage wxMpConfigStorage() {
        WxMpInMemoryConfigStorage wxMpConfigStorage = new WxMpInMemoryConfigStorage();
        wxMpConfigStorage.setAppId(wechatAccountConfig.getMpAppId());
        wxMpConfigStorage.setSecret(wechatAccountConfig.getMpAppSecret());
        return wxMpConfigStorage;
    }
}

接口調用

    //跳轉到授權鏈接
     @GetMapping("/authorize")
        public String authorize( @ApiParam(name = "returnUrl", value = "跳轉鏈接")@RequestParam("returnUrl") String returnUrl) {
            //1. 配置
            //2. 調用方法
            String url = projectUrlConfig.getWechatMpAuthorize() + "/wechat/userInfo";
            String redirectUrl = wxMpService.oauth2buildAuthorizationUrl(url, WxConsts.OAuth2Scope.SNSAPI_BASE, URLEncoder.encode(returnUrl));
            return "redirect:" + redirectUrl;
    }
    //確定授權后的處理方法
    @GetMapping("/userInfo")
    public String userInfo(@ApiParam(name = "code", value = "code")@RequestParam("returnUrl") String code,
                           @ApiParam(name = "returnUrl", value = "跳轉鏈接")@RequestParam("returnUrl") String returnUrl ){
        WxMpOAuth2AccessToken wxMpOAuth2AccessToken = new WxMpOAuth2AccessToken();
        try {
            wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);
        } catch (WxErrorException e) {
            log.error("[微信頁面授權失敗]{}",e);
            throw new SellException(ResultEnum.WECHAT_MP_ERROR.getCode(),e.getError().getErrorMsg());
        }
        String openId = wxMpOAuth2AccessToken.getOpenId();

        return "redirect:" + returnUrl + "openId = " + openId;
    }

第三方網頁掃碼登陸 開發(fā)前準備

微信開放平臺,需要自己去申請一個應用,審核通過后得到

開發(fā)

生成二維碼,拿到openId
第三方SDK

配置WxMpServiceImpl

@Component
public class WechatOpenConfig {
    @Autowired
    private WechatAccountConfig accountConfig;

    @Bean
    public WxMpService wxOpenService() {
        WxMpService wxOpenService = new WxMpServiceImpl();
        wxOpenService.setWxMpConfigStorage(wxOpenConfigStorage());
        return wxOpenService;
    }

    @Bean
    public WxMpConfigStorage wxOpenConfigStorage() {
        WxMpInMemoryConfigStorage wxMpInMemoryConfigStorage = new WxMpInMemoryConfigStorage();
        wxMpInMemoryConfigStorage.setAppId(accountConfig.getOpenAppId());
        wxMpInMemoryConfigStorage.setSecret(accountConfig.getOpenAppSecret());
        return wxMpInMemoryConfigStorage;
    }

2. 接口調用
    //跳轉二維碼頁面,生成二維碼
    @GetMapping("/qrAuthorize")
    public String qrAuthorize(@RequestParam("returnUrl") String returnUrl) {
        String url = projectUrlConfig.getWechatOpenAuthorize() + "/sell/wechat/qrUserInfo";
        String redirectUrl = wxOpenService.buildQrConnectUrl(url, WxConsts.QrConnectScope.SNSAPI_LOGIN, URLEncoder.encode(returnUrl));
        return "redirect:" + redirectUrl;
    }

    //掃碼后邏輯登陸
    @GetMapping("/qrUserInfo")
    public String qrUserInfo(@RequestParam("code") String code,
                             @RequestParam("state") String returnUrl) {
        WxMpOAuth2AccessToken wxMpOAuth2AccessToken = new WxMpOAuth2AccessToken();
        try {
            wxMpOAuth2AccessToken = wxOpenService.oauth2getAccessToken(code);
        } catch (WxErrorException e) {
            log.error("【微信網頁授權】{}", e);
            throw new SellException(ResultEnum.WECHAT_MP_ERROR.getCode(), e.getError().getErrorMsg());
        }
        log.info("wxMpOAuth2AccessToken={}", wxMpOAuth2AccessToken);
        String openId = wxMpOAuth2AccessToken.getOpenId();

        return "redirect:" + returnUrl + "?openid=" + openId;
    }
```
微信支付

微信支付SDK,這個SDK是上方的SDK對支付的進一步封裝
微信支付官方開發(fā)文檔
需要申請一個具有商家資質的賬號,等到mchId和mchKey

配置BestPayServiceImpl

@Component
public class WechatPayConfig {

    @Autowired
    private WechatAccountConfig wechatAccountConfig;

    @Bean
    public BestPayServiceImpl bestPayService(){
        BestPayServiceImpl bestPayService = new BestPayServiceImpl();
        bestPayService.setWxPayH5Config(wxPayH5Config());
        return bestPayService;
    }

    @Bean
    public WxPayH5Config wxPayH5Config(){
        WxPayH5Config wxPayH5Config = new WxPayH5Config();
        wxPayH5Config.setAppId(wechatAccountConfig.getMpAppId());
        wxPayH5Config.setAppSecret(wechatAccountConfig.getMpAppSecret());
        wxPayH5Config.setMchId(wechatAccountConfig.getMchId());
        wxPayH5Config.setMchKey(wechatAccountConfig.getMchKey());
        wxPayH5Config.setKeyPath(wechatAccountConfig.getKeyPath());
        wxPayH5Config.setNotifyUrl(wechatAccountConfig.getNotifyUrl());
        return wxPayH5Config;
    }
}

編寫Service

@Service
@Slf4j
public class PayServiceImpl implements PayService {

    private static final String ORDER_NAME = "微信點餐訂單";

    @Autowired
    private BestPayServiceImpl bestPayService;

    @Autowired
    private OrderService orderService;

    //發(fā)起支付
    @Override
    public PayResponse create(OrderDTO orderDTO) {
        PayRequest payRequest = new PayRequest();
        payRequest.setOpenid(orderDTO.getBuyerOpenid());
        payRequest.setOrderAmount(orderDTO.getOrderAmount().doubleValue());
        payRequest.setOrderId(orderDTO.getOrderId());
        payRequest.setOrderName(ORDER_NAME);
        payRequest.setPayTypeEnum(BestPayTypeEnum.WXPAY_H5);
        log.info("【微信支付】發(fā)起支付, request={}", JsonUtil.toJson(payRequest));

        PayResponse payResponse = bestPayService.pay(payRequest);
        log.info("【微信支付】發(fā)起支付, response={}", JsonUtil.toJson(payResponse));
        return payResponse;
    }

    //支付后微信異步通知,告之微信支付結果
    @Override
    public PayResponse notify(String notifyData) {
        PayResponse payResponse = bestPayService.asyncNotify(notifyData);
        log.info("【微信支付】異步通知, payResponse={}", JsonUtil.toJson(payResponse));

        //查詢訂單
        OrderDTO orderDTO = orderService.findOne(payResponse.getOrderId());
        //判斷訂單是否存在
        if (orderDTO == null) {
            log.error("【微信支付】異步通知, 訂單不存在, orderId={}", payResponse.getOrderId());
            throw new SellException(ResultEnum.ORDER_NOT_EXIST);
        }

        //判斷金額是否一致(0.10   0.1)
        if (!MathUtil.equals(payResponse.getOrderAmount(), orderDTO.getOrderAmount().doubleValue())) {
            log.error("【微信支付】異步通知, 訂單金額不一致, orderId={}, 微信通知金額={}, 系統(tǒng)金額={}",
                    payResponse.getOrderId(),
                    payResponse.getOrderAmount(),
                    orderDTO.getOrderAmount());
            throw new SellException(ResultEnum.WXPAY_NOTIFY_MONEY_VERIFY_ERROR);
        }

        //修改訂單的支付狀態(tài)
        orderService.paid(orderDTO);
        return payResponse;
    }

    //退款
    @Override
    public RefundResponse refund(OrderDTO orderDTO) {
        RefundRequest refundRequest = new RefundRequest();
        refundRequest.setOrderId(orderDTO.getOrderId());
        refundRequest.setOrderAmount(orderDTO.getOrderAmount().doubleValue());
        refundRequest.setPayTypeEnum(BestPayTypeEnum.WXPAY_H5);
        log.info("【微信退款】request={}", JsonUtil.toJson(refundRequest));
        RefundResponse refundResponse = bestPayService.refund(refundRequest);
        return refundResponse;
    }
}

微信模版消息通知

在公眾號管理設置好消息模版
編寫service

   @Override
    public void orderStatus(OrderDTO orderDTO) {
        WxMpTemplateMessage templateMessage = new WxMpTemplateMessage();
        templateMessage.setTemplateId(wechatAccountConfig.getTemplateId().get("orderStatus"));
        templateMessage.setToUser(orderDTO.getBuyerOpenid());
        List data = Arrays.asList(
                new WxMpTemplateData("first","111"),
                new WxMpTemplateData("keyword1", "微信點餐"),
                new WxMpTemplateData("keyword2", "18868812345"),
                new WxMpTemplateData("keyword3", orderDTO.getOrderId()),
                new WxMpTemplateData("keyword4", orderDTO.getOrderStatusEnum().getMessage()),
                new WxMpTemplateData("keyword5", "¥" + orderDTO.getOrderAmount()),
                new WxMpTemplateData("remark", "歡迎再次光臨!")
        );
        try{
            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
        }catch (WxErrorException e){
            log.error("【微信模版消息】發(fā)送失敗");
        }
    }
}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/76064.html

相關文章

  • Java 程序員必備的 15 個框架,前 3 個地位無可動搖!

    摘要:官網源碼推薦從開始手寫一個框架更多請在技術棧微信公眾號后臺回復關鍵字。是一個開放源代碼的對象關系映射框架,它對進行了非常輕量級的對象封裝,它將與數(shù)據(jù)庫表建立映射關系,是一個全自動的框架。 Java 程序員方向太多,且不說移動開發(fā)、大數(shù)據(jù)、區(qū)塊鏈、人工智能這些,大部分 Java 程序員都是 Java Web/后端開發(fā)。那作為一名 Java Web 開發(fā)程序員必須需要熟悉哪些框架呢? 今天...

    galaxy_robot 評論0 收藏0
  • 推薦10個Java方向最熱門的開源項目(8月)

    摘要:設計模式可以通過提供經過驗證的經過驗證的開發(fā)范例來加速開發(fā)過程。將流程作為突破點,并在多個領域工作,包括流量控制,并發(fā),斷路和負載保護,以保護服務穩(wěn)定性。 1. JCSprout(Java核心知識庫) Github地址: https://github.com/crossoverJie/JCSprout star: 12k 介紹: 處于萌芽階段的 Java 核心知識庫。 2....

    wushuiyong 評論0 收藏0
  • 一份最中肯的Java學習路線+資源分享(拒絕傻逼式分享)

    摘要:因為某些原因,不方便在這里直接發(fā)送百度鏈接,關注我的微信公眾號面試通關手冊回復資源分享第一波即可領取。然后大家還有什么問題的話,可以在我的微信公眾號后臺面試通關手冊給我說或者加我微信,我會根據(jù)自己的學習經驗給了說一下自己的看法。 這是一篇針對Java初學者,或者說在Java學習路線上出了一些問題(不知道該學什么、不知道整體的學習路線是什么樣的) 第一步:Java基礎(一個月左右) 推薦...

    hearaway 評論0 收藏0
  • Spring Boot 配置加載順序詳解

    摘要:使用會涉及到各種各樣的配置,如開發(fā)測試線上就至少套配置信息了。本章內容基于進行詳解。添加測試類運行單元測試,程序輸出根據(jù)以上參數(shù)動態(tài)調整,發(fā)現(xiàn)參數(shù)會被正確被覆蓋。了解了各種配置的加載順序,如果配置被覆蓋了我們就知道是什么問題了。 使用 Spring Boot 會涉及到各種各樣的配置,如開發(fā)、測試、線上就至少 3 套配置信息了。Spring Boot 可以輕松的幫助我們使用相同的代碼就能...

    BetaRabbit 評論0 收藏0
  • 厲害了,Spring Cloud for Alibaba 來了!

    摘要:棧長有話說其實項目就是為了阿里的項目能很好的結合融入使用,這個項目目前由阿里維護。對同時使用和阿里巴巴項目的人來說無疑帶來了巨大的便利,一方面能結合無縫接入,另一方面還能使用阿里巴巴的組件,也帶來了更多的可選擇性。 最近,Spring Cloud 發(fā)布了 Spring Cloud Alibaba 首個預覽版本:Spring Cloud for Alibaba 0.2.0. 大家都好奇,...

    lbool 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<