最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Boot中的微信支付全過程(小程序)

 更新時(shí)間:2022年05月27日 08:42:45   作者:Apluemxa  
微信支付是企業(yè)級項(xiàng)目中經(jīng)常使用到的功能,作為后端開發(fā)人員,完整地掌握該技術(shù)是十分有必要的。今天通過本文給大家介紹Spring?Boot中的微信支付全過程,感興趣的朋友一起看看吧

前言

微信支付是企業(yè)級項(xiàng)目中經(jīng)常使用到的功能,作為后端開發(fā)人員,完整地掌握該技術(shù)是十分有必要的。

一、申請流程和步驟

圖1-1

  • 注冊微信支付賬號
  • 獲取微信小程序APPID
  • 獲取微信商家的商戶ID
  • 獲取微信商家的API私鑰
  • 配置微信支付回調(diào)地址
  • 綁定微信小程序和微信支付的關(guān)系
  • 搭建SpringBoot工程編寫后臺支付接口
  • 發(fā)布部署接口服務(wù)項(xiàng)目
  • 使用微信小程序或者UniAPP調(diào)用微信支付功能
  • 支付接口的封裝
  • 配置jwt或者openid的token派發(fā)
  • 原生微信小程序完成支付對接

二、注冊商家

2.1商戶平臺

商家或者企業(yè)想要通過微信支付來進(jìn)行商品的銷售,必須先通過微信平臺(pay.weixin.qq.com)去將商家進(jìn)行注冊。注冊成功后將會有商戶信息等界面,包括商家的賬戶信息、企業(yè)信息等等。如圖2-1所示:

圖2-1

2.2商戶id

商戶id是項(xiàng)目開發(fā)中的唯一標(biāo)識,是微信支付給予每個(gè)商戶或者企業(yè)的唯一id。也是客戶(消費(fèi)者)在拉起微信支付時(shí)的憑據(jù)之一,在圖2-1中的“微信支付商戶號”就是商戶id。

三、API私鑰(支付密鑰)

在注冊商戶成功后,同樣在微信平臺(pay.weixin.qq.com)可以對API私鑰進(jìn)行設(shè)置。如圖3-1所示:

圖3-1

API私鑰也稱為支付密鑰,商戶id和API密鑰是用戶拉起微信支付時(shí)后臺所必須獲取的。

四、商戶簽約微信支付產(chǎn)品

商戶可以根據(jù)需要簽約微信支付的產(chǎn)品,主要包括有:

  • JSAPI支付:商戶通過調(diào)用微信支付提供的JSAPI接口,在支付場景中調(diào)起微信支付模塊完成收款;
  • Native支付:商戶系統(tǒng)按微信支付協(xié)議生成支付二維碼,用戶再用微信“掃一掃”完成支付的模式;
  • 小程序支付:通過好友分享或掃描二維碼在微信內(nèi)打開小程序時(shí),可以調(diào)用微信支付完成下單購買的流程;
  • 付款碼支付:用戶出示微信錢包中的條碼、二維碼,商家通過掃描用戶條碼即可完成收款;
  • 刷臉支付:用戶在集成微信刷臉支付SDK的線下機(jī)具上"刷臉"即可完成支付。

如圖4-1所示:

圖4-1

五、配置回調(diào)地址

支付回調(diào)地址是微信支付服務(wù)器返回給用戶支付信息(通知)的地址。如果商戶簽約的是微信小程序產(chǎn)品,那么支付回調(diào)地址可以配置也可以不進(jìn)行配置。該地址為公司的域名,或者不加以配置。

六、小程序獲取APPID

首先要登錄申請官網(wǎng)進(jìn)行微信小程序的注冊:https://mp.weixin.qq.com/,如圖6-1所示:

圖6-1

注冊成功后即可獲得小程序唯一的APPID。如圖6-2所示:

圖6-2

七、微信支付與小程序綁定

在微信支付平臺對APPID進(jìn)行綁定即可。如圖7-1所示:

圖7-1

八、實(shí)戰(zhàn)部分

8.1SpringBoot框架搭建

  • 首先創(chuàng)建一個(gè)初始化SpringBoot項(xiàng)目;
  • 在項(xiàng)目/模塊的resources文件夾下,編寫properties/yml配置文件;
  • 配置文件中需隔離dev環(huán)境與prod環(huán)境;
  • 配置文件中還包括了server、數(shù)據(jù)庫、spring、token、日志、時(shí)區(qū)、json格式、mybatis-plus、swagger、redis、服務(wù)器配置、微信小程序配置(包括支付相關(guān))等等全局統(tǒng)一配置。
  • 項(xiàng)目基本架構(gòu)(SSM:Spring+SpringMVC+MyBatis)
  • controller
  • 后端接口,與前端數(shù)據(jù)交互
  • config
    • 云服務(wù)器配置
    • Swagger配置
    • 接口攔截器(路由)
    • 微信支付配置(引入微信相關(guān)服務(wù))
  • common
  • constant
  • enums
  • Ajaxresult
  • BaseController
  • BaseEntity
  • Page(Page與Table返回參數(shù))
  • domain
  • 接口與頁面所需參數(shù)(DTO、entity、req、res、VO等)
  • mapper
  • mapper文件接口(SQL方法定義)
  • service
  • Service:承接Controller層的接口方法定義
  • Impl(接口實(shí)現(xiàn)類):接口的具體實(shí)現(xiàn)邏輯
  • utils
  • 文件工具類
  • Json工具類
  • 時(shí)間格式工具類
  • 第三方登錄工具類

8.2微信支付相關(guān)接口

8.2.1小程序用戶登錄接口

用戶首先需要在小程序端進(jìn)行微信用戶登錄授權(quán),需調(diào)用接口獲取登錄憑證(code)。通過憑證進(jìn)而換取用戶登錄態(tài)信息,包括用戶在當(dāng)前小程序的唯一標(biāo)識(openid)、微信開放平臺帳號下的唯一標(biāo)識(unionid,若當(dāng)前小程序已綁定到微信開放平臺帳號)及本次登錄的會話密鑰(session_key)等。

具體的登錄流程如圖8-1所示:

圖8-1

此時(shí)調(diào)用服務(wù)端接口,請求參數(shù)如圖8-2所示:

圖8-2

用戶登錄后的返回參數(shù),如圖8-3所示:

圖8-3

8.2.2統(tǒng)一下單接口

用戶登錄小程序后,在小程序頁面拉起支付請求時(shí),會調(diào)用統(tǒng)一的下單接口。

在拉起支付請求時(shí),下單接口參數(shù)需要兩部分:一是商戶、小程序相關(guān)的openid,appid等,二是需要商品相關(guān)的價(jià)格,名稱,數(shù)量等參數(shù)。

以下將用代碼來對微信支付接口做詳細(xì)的講解,代碼以REST風(fēng)格API接口的形式編寫。

統(tǒng)一下單接口

@ApiOperation(value = "統(tǒng)一下單接口")
@RequestMapping(value = "/unifiedOrder",method = RequestMethod.POST)
public AjaxResult unifiedOrder(HttpServletRequest req,@RequestBody){
    //校驗(yàn)小程序(微信)用戶登錄
    //查詢數(shù)據(jù)庫訂單信息(狀態(tài))
    //只有未支付訂單才能發(fā)起支付
    //0元購買不調(diào)支付
    /**
     * 設(shè)置商戶、小程序相關(guān)請求參數(shù)
     * */
    //獲取小程序的appId
    String appId = WxMaUtil.getAppId(request);
    WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest = new WxPayUnifiedOrderRequest();
    wxPayUnifiedOrderRequest.setAppid(appId);
    //商品名稱
    String body = sysOrdersCourse.getCourseName();
    body =body.length() > 40 ? body.substring(0,39) : body;
    wxPayUnifiedOrderRequest.setBody(body);
    //訂單編號
    wxPayUnifiedOrderRequest.setOutTradeNo(sysOrders.getOrderNo());
    //訂單金額
    wxPayUnifiedOrderRequest.setTotalFee(sysOrders.getOrderAmount().multiply(new             BigDecimal(100)).intValue());
    //交易類型
    wxPayUnifiedOrderRequest.setTradeType("JSAPI");
    //支付回調(diào)地址
         wxPayUnifiedOrderRequest.setNotifyUrl(env.getProperty("notify-host")+"/wx/api/order/notify-order");
    wxPayUnifiedOrderRequest.setSpbillCreateIp("127.0.0.1");
    //用戶在當(dāng)前小程序中的唯一標(biāo)識
    wxPayUnifiedOrderRequest.setOpenid(wxUser.getOpenId());
    //調(diào)用微信服務(wù)類
    WxPayService wxPayService = WxPayConfiguration.getPayService();
    return AjaxResult.success(JSONUtils.parse(wxPayService.createOrder(wxPayUnifiedOrderRequest)));
}

8.2.3創(chuàng)建訂單接口

創(chuàng)建訂單接口

用戶可以在商品頁面對某個(gè)商品進(jìn)行下單,此時(shí)需要?jiǎng)?chuàng)建該用戶購買某個(gè)商品的訂單。

該過程主要是通過接口去請求用戶信息、商品信息等參數(shù),經(jīng)過邏輯判斷(是否存在已購買的訂單)后創(chuàng)建(數(shù)據(jù)庫插入相關(guān)信息)新的訂單,最后返回該訂單的所需數(shù)據(jù)。

@ApiOperation(value = "創(chuàng)建訂單")
    @RequestMapping(value = "/create",method = RequestMethod.POST)
    public AjaxResult create(@RequestBody WxOrderRequest wxOrderRequest){
        //微信用戶信息
        //判斷是否購買過相同商品,若已經(jīng)購買過,則無法創(chuàng)建新的訂單
        //滿足條件后將數(shù)據(jù)插入數(shù)據(jù)庫
         WxOrderResponse wxOrderResponse = orderService.add(wxOrderRequest);
        //如果新增失敗,則返回提示
         if (wxOrderResponse == null){
             return AjaxResult.error("訂單創(chuàng)建失敗");
         }
         return AjaxResult.success(wxOrderResponse);
     }

8.2.4取消訂單接口

取消訂單接口

當(dāng)用戶拉起微信支付時(shí),如果在付款界面點(diǎn)擊×取消付款(但此時(shí)訂單已經(jīng)創(chuàng)建),則該操作視為取消訂單支付,同時(shí)在訂單頁面應(yīng)當(dāng)顯示此時(shí)該訂單的支付狀態(tài)。

該接口可以通過訂單id來作為請求參數(shù),首先判斷數(shù)據(jù)庫中是否存在該訂單信息,接著對可以取消支付的訂單類型進(jìn)行限制,最后更新數(shù)據(jù)庫表(訂單、商品和聲明周期)狀態(tài)。

@ApiOperation(value = "取消訂單")
@RequestMapping(value = "/cancel/{orderId}",method = RequestMethod.PUT)
    public AjaxResult cancel(@PathVariable Long orderId){
        //判斷訂單是否存在
        SysOrders sysOrders = sysOrdersService.getById(orderId);
        if(sysOrders==null){
            return AjaxResult.error("訂單不存在");
        }
        //只有未支付的訂單能取消
        if(!CommonConstants.NO.equals(sysOrders.getIsPay())){
            return AjaxResult.error(MyReturnCode.ERR_70001.getCode(), MyReturnCode.ERR_70001.getMsg());
        }
        sysOrdersService.orderCancel(sysOrders);
        return AjaxResult.success();
    }

8.2.5訂單詳情接口

訂單詳情接口

當(dāng)訂單生成后,用戶可以在頁面查看該商品訂單的詳情。

該接口通過訂單id即可從數(shù)據(jù)庫獲取詳情信息,而該頁面展示的數(shù)據(jù)由業(yè)務(wù)需求確定。

@ApiOperation(value = "訂單詳情")
@RequestMapping(value = "/myOrderDetail/{orderId}",method = RequestMethod.GET)
@ApiImplicitParams({@ApiImplicitParam(name = "orderId", value = "訂單Id")})
     public AjaxResult myOrderDetail(@PathVariable Long orderId){
     //從數(shù)據(jù)庫獲取詳情參數(shù)
     SysOrderDetailResponse detailResponse = sysOrdersService.getDetail(orderId);
     return AjaxResult.success(detailResponse);
     }

訂單詳情邏輯

 /**
     * 訂單詳情頁面參數(shù)處理
     * @param orderId
     * @return sysOrderDetailResponse
     */
    @Override
    public SysOrderDetailResponse getDetail(Long orderId) {
        SysOrderDetailResponse sysOrderDetailResponse =  orderMapper.getDetail(orderId);
        //對頁面的手機(jī)號做處理
        String phoneNum = sysOrderDetailResponse.getMobile();
        sysOrderDetailResponse.setMobile(phoneNum.substring(0,3) + "****" +       phoneNum.substring(7,phoneNum.length()));
        //根據(jù)訂單狀態(tài)不同,顯示不同的數(shù)據(jù)
        //計(jì)算剩余待支付時(shí)間并展示
        return sysOrderDetailResponse;
    }

8.2.6支付回調(diào)接口

微信支付回調(diào)是用戶在對商品進(jìn)行支付操作后,將數(shù)據(jù)發(fā)送至微信服務(wù)器,微信服務(wù)器再將支付的結(jié)果返回(通知)給用戶和商家的過程。

其中,主要關(guān)注的是用戶支付-微信回調(diào)判斷-修改數(shù)據(jù)庫這個(gè)過程。

支付回調(diào)接口

@ApiOperation("支付回調(diào)")
@RequestMapping(value = "notify-order", method = RequestMethod.POST)
    public String notifyOrder(@RequestBody String xmlData) throws WxPayException {
        log.info("支付回調(diào):" + xmlData);
        //微信支付服務(wù)
        WxPayService wxPayService = WxPayConfiguration.getPayService();
        WxPayOrderNotifyResult notifyResult = wxPayService.parseOrderNotifyResult(xmlData);
        log.info("支付回調(diào)解析結(jié)果" + notifyResult);
        //對創(chuàng)建的訂單進(jìn)行支付
        SysOrders sysOrders = orderService.getOne(notifyResult.getOutTradeNo());
        if (sysOrders != null) {
            if (sysOrders.getOrderAmount().multiply(new BigDecimal(100)).intValue() == notifyResult.getTotalFee()){
                 String timeEnd = notifyResult.getTimeEnd();
                 LocalDateTime paymentTime = LocalDateTimeUtils.parse(timeEnd);
                 //支付時(shí)間
                 sysOrders.setPaymentTime(paymentTime);
                 sysOrders.setOrderAmount(sysOrders.getOrderAmount());
                 //微信訂單編號
                 sysOrders.setTransactionId(notifyResult.getTransactionId());
                 //更新數(shù)據(jù)庫
                 orderService.notifyOrder(sysOrders);
                 log.info("支付回調(diào)成功通知:" + sysOrders.getOrderNo());
                 return WxPayNotifyResponse.success("支付成功");
            } else {
                 return WxPayNotifyResponse.fail("付款金額與訂單金額不符");
            }
        } else {
            return WxPayNotifyResponse.fail("無此訂單");
        }
    }

其中,notifyOrder方法的作用是在支付成功后在數(shù)據(jù)庫更新訂單的狀態(tài)。

notifyOrder(SysOrders sysOrders)方法

@Override
    @Transactional(rollbackFor = Exception.class)
    public void notifyOrder(SysOrders sysOrders) {
       //只有未支付訂單能操作,即is_pay字段為0的訂單
       if(CommonConstants.NO.equals(sysOrders.getIsPay())) {
       //更新訂單支付狀態(tài)
       sysOrders.setIsPay(CommonConstants.YES);
       sysOrders.setStatus(OrderInfoEnum.STATUS_1.getValue());
       sysOrdersMapper.updateById(sysOrders);
       //更新商品表狀態(tài)
       //更新訂單生命周期表
       }
    }

到此這篇關(guān)于Spring Boot中的微信支付(小程序)功能的文章就介紹到這了,更多相關(guān)Spring Boot中的微信支付(小程序)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • idea 開發(fā)神器之idea插件匯總

    idea 開發(fā)神器之idea插件匯總

    這篇文章主要介紹了idea 開發(fā)神器之idea插件匯總,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • SpringBoot Maven打包如何根據(jù)環(huán)境排除文件

    SpringBoot Maven打包如何根據(jù)環(huán)境排除文件

    文章介紹了在SpringBoot項(xiàng)目中,根據(jù)不同的環(huán)境(開發(fā)、測試、生產(chǎn))進(jìn)行JSP文件打包處理的方法,通過配置`pom.xml`文件中的``標(biāo)簽,可以實(shí)現(xiàn)開發(fā)環(huán)境保留`index.jsp`文件,測試環(huán)境和生產(chǎn)環(huán)境排除該文件
    2024-12-12
  • Java 散列存儲詳解及簡單示例

    Java 散列存儲詳解及簡單示例

    這篇文章主要介紹了Java 散列存儲詳解及簡單示例的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 深入解析JVM對dll文件和對類的裝載過程

    深入解析JVM對dll文件和對類的裝載過程

    這篇文章主要介紹了JVM對dll文件的裝載和對類的裝載過程,針對Java在Windows下的一些運(yùn)行情況作出講解,需要的朋友可以參考下
    2015-11-11
  • SpringBoot中使用?POI的示例代碼

    SpringBoot中使用?POI的示例代碼

    這篇文章主要介紹了SpringBoot中使用POI的實(shí)例詳解,包括引入poi的jar包和創(chuàng)建excel的實(shí)例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • springboot中獲取配置文件中屬性值的幾種方式小結(jié)

    springboot中獲取配置文件中屬性值的幾種方式小結(jié)

    本文主要介紹了springboot中獲取配置文件中屬性值的幾種方式小結(jié),主要介紹了六種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • java后臺如何接收get請求傳過來的數(shù)組

    java后臺如何接收get請求傳過來的數(shù)組

    這篇文章主要介紹了java后臺如何接收get請求傳過來的數(shù)組問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • java如何通過Kerberos認(rèn)證方式連接hive

    java如何通過Kerberos認(rèn)證方式連接hive

    該文主要介紹了如何在數(shù)據(jù)源管理功能中適配不同數(shù)據(jù)源(如MySQL、PostgreSQL和Hive),特別是如何在SpringBoot3框架下通過Kerberos認(rèn)證與Hive進(jìn)行安全交互,文章詳細(xì)描述了Kerberos認(rèn)證過程,包括配置krb5.conf和keytab文件、處理Hadoop和Hive版本兼容性問題
    2025-02-02
  • JavaWeb實(shí)現(xiàn)Session跨頁面?zhèn)鬟f數(shù)據(jù)

    JavaWeb實(shí)現(xiàn)Session跨頁面?zhèn)鬟f數(shù)據(jù)

    本文主要介紹了 JavaWeb實(shí)現(xiàn)Session跨頁面?zhèn)鬟f數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Java?List集合取交集的五種常見方式總結(jié)

    Java?List集合取交集的五種常見方式總結(jié)

    在Java中取兩個(gè)List集合的交集可以通過多種方式實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于Java?List集合取交集的五種常見方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07

最新評論

施甸县| 凤山市| 吉木萨尔县| 甘洛县| 柞水县| 封丘县| 明水县| 原平市| 彰化市| 海南省| 封丘县| 措勤县| 苏尼特左旗| 十堰市| 怀安县| 醴陵市| 徐闻县| 巴彦淖尔市| 南溪县| 固安县| 衡东县| 昌黎县| 黄浦区| 通江县| 家居| 潼南县| 克什克腾旗| 松桃| 偏关县| 泉州市| 黔江区| 海淀区| 邹平县| 平凉市| 教育| 朝阳区| 宁城县| 宁德市| 晋江市| 南京市| 安泽县|