精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

微信支付V3版本集成詳解【避坑指南】

開發 后端
V3版本的集成,官方文檔還是比較清晰的,但各類的配置,一個不小心就掉坑里半天爬不出來。趁著思路清晰,特此記錄一下。

最近對項目中的微信支付功能做了升級,之前使用的是V2版本。V2版本目前還可以使用,但已暫停更新。V3版本的集成,官方文檔還是比較清晰的,但各類的配置,一個不小心就掉坑里半天爬不出來。趁著思路清晰,特此記錄一下。

V2版本參數格式是xml格式,不太好維護,V3版本已改成json格式。

V2版本的簽名是拼在參數里面的,V3版本校驗都放在配置類里面了,更加方便靈活。

前置條件

官方文檔:
https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml

1、微信開放平臺 – APP支付

  • 注冊APP,獲取appId appSecret等信息

2、微信公眾平臺 – (微信公眾號 小程序) 微信內支付

  • 開通賬號,申請支付功能,綁定商戶平臺
  • 配置域名等

3、瀏覽器H5支付

  • 申請權限:微信支付商戶平臺—>產品中心—>H5支付—>申請開通
  • 配置:產品中心—>開發配置—>H5支付

4、微信商戶平臺

  •  商戶號
  • API證書密鑰及證書序列號

  • API v3密鑰

代碼集成

微信提供兩種集成方式:wechatpay-java(推薦);wechatpay-apache-httpclient,以推薦的方式為例:

<dependency>
  <groupId>com.github.wechatpay-apiv3</groupId>
  <artifactId>wechatpay-java</artifactId>
  <version>0.2.5</version>
</dependency>

配置初始化 – 加載微信支付平臺證書

使用自動更新平臺證書的配置類 RSAAutoCertificateConfig。注:每個商戶號只能創建一個 RSAAutoCertificateConfig。

代碼實現,將配置交由Spring統一管理,單例模式保證初始化一次。

@Configuration
public class WXPayConfig {

    private Config config;

    @PostConstruct
    public void init(){
        config =
                new RSAAutoCertificateConfig.Builder()
                        .merchantId(WXPayConstants.MCHID)
                        .privateKey(WXPayConstants.PRIVATE_KEY)
                        .merchantSerialNumber(WXPayConstants.MERCHANT_SERIAL_NUMBER)
                        .apiV3Key(WXPayConstants.API_V3_KEY)
                        .build();
    }

    @Bean("h5Service")
    public H5Service getH5Service(){
        // H5支付
        return new H5Service.Builder().config(config).build();
    }

    @Bean("jsService")
    public JsapiServiceExtension getJsService(){

        // 微信js支付
        return new JsapiServiceExtension.Builder()
                        .config(config)
                        .signType("RSA") // 不填則默認為RSA
                        .build();
    }

    @Bean("appService")
    public AppServiceExtension getAppService() {
        // App支付
        return new AppServiceExtension.Builder().config(config).build();
    }

    @Bean("NotificationParser")
    public NotificationParser getNotificationParser(){
        // 支付回調的解析器
        return new NotificationParser((NotificationConfig)config);
    }
}

獲取支付請求信息

APP下單

/**
 * 獲取微信支付參數(APP)
 */
public WechatPayDTO getWechatAppPayParam(BigDecimal money, String orderNumber, String notifyUrl) throws Exception {
    // 下單
    com.wechat.pay.java.service.payments.app.model.PrepayRequest request = new com.wechat.pay.java.service.payments.app.model.PrepayRequest();
    com.wechat.pay.java.service.payments.app.model.Amount amount = new com.wechat.pay.java.service.payments.app.model.Amount();
    amount.setTotal(Integer.parseInt(totalFee(money)));
    amount.setCurrency("CNY");
    request.setAmount(amount);
    request.setAppid(WXPayConstants.APPID);
    request.setMchid(WXPayConstants.MCHID);
    request.setDescription("");
    request.setNotifyUrl(notifyUrl);
    request.setOutTradeNo(orderNumber);
    com.wechat.pay.java.service.payments.app.model.PrepayWithRequestPaymentResponse response = appService.prepayWithRequestPayment(request);
    return WechatPayDTO.builder()
            .appid(response.getAppid())
            .partnerid(response.getPartnerId())
            .prepayid(response.getPrepayId())
            .packageVal(response.getPackageVal())
            .timestamp(response.getTimestamp())
            .noncestr(response.getNonceStr())
            .sign(response.getSign())
            .build();
}

公眾號 小程序下單

/**
 * 獲取微信支付參數(公眾號 小程序)
 */
public WechatPayDTO getWechatJSAPIPayParam(String openid, BigDecimal money, String orderNumber, String notifyUrl) throws Exception {
    // 下單
    com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest request = new com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest();
    com.wechat.pay.java.service.payments.jsapi.model.Amount amount = new com.wechat.pay.java.service.payments.jsapi.model.Amount();
    amount.setTotal(Integer.parseInt(totalFee(money)));
    amount.setCurrency("CNY");
    request.setAmount(amount);
    request.setAppid(WXPayConstants.PUBLIC_APPID);
    request.setMchid(WXPayConstants.MCHID);
    request.setDescription("");
    request.setNotifyUrl(notifyUrl);
    request.setOutTradeNo(orderNumber);
    Payer payer = new Payer();
    payer.setOpenid(openid);
    request.setPayer(payer);
    PrepayWithRequestPaymentResponse response = jsService.prepayWithRequestPayment(request);
    logger.info("JS支付參數:{}", response.toString());
    return WechatPayDTO.builder()
            .appid(response.getAppId())
            .packageVal(response.getPackageVal())
            .timestamp(response.getTimeStamp())
            .noncestr(response.getNonceStr())
            .signType(response.getSignType())
            .paySign(response.getPaySign())
            .build();
}

H5下單

/**
  * 獲取微信H5支付連接
	*/
public String getWechatH5PayUrl(BigDecimal money, String orderNumber, String notifyUrl) {
      // 下單
      PrepayRequest request = new PrepayRequest();
      Amount amount = new Amount();
      amount.setTotal(Integer.parseInt(totalFee(money)));
      amount.setCurrency("CNY");
      request.setAmount(amount);
      SceneInfo sceneInfo = new SceneInfo();
      sceneInfo.setPayerClientIp("");
      request.setSceneInfo(sceneInfo);
      request.setAppid(WXPayConstants.PUBLIC_APPID);
      request.setMchid(WXPayConstants.MCHID);
      request.setDescription("");
      request.setNotifyUrl(notifyUrl);
      request.setOutTradeNo(orderNumber);
      // 調用接口
      PrepayResponse response = h5Service.prepay(request);
      return response.getH5Url();
}

支付回調

獲取 HTTP 請求頭中的以下值,構建 RequestParam 。

  • Wechatpay-Signature
  • Wechatpay-Nonce
  • Wechatpay-Timestamp
  • Wechatpay-Serial
  • Wechatpay-Signature-Type

獲取 HTTP 請求體 body。切記不要用 JSON 對象序列化后的字符串,避免驗簽的 body 和原文不一致。

根據解密后的通知數據數據結構,構造解密對象類 DecryptObject 。支付結果通知解密對象類為 Transaction,退款結果通知解密對象類為 RefundNotification

初始化 RSAAutoCertificateConfig(已在前文統一初始化)。

初始化 NotificationParser(已在前文統一初始化)。

使用請求參數 requestParam 和 DecryptObject.class ,調用 parser.parse 驗簽并解密報文。

RequestParam requestParam = new RequestParam.Builder()
      .serialNumber(request.getHeader("Wechatpay-Serial"))
      .nonce(request.getHeader("Wechatpay-Nonce"))
      .signature(request.getHeader("Wechatpay-Signature"))
      .timestamp(request.getHeader("Wechatpay-Timestamp"))
      .signType(request.getHeader("Wechatpay-Signature-Type"))
      .body(body)
      .build();

Transaction transaction = notificationParser.parse(requestParam, Transaction.class);
if (Objects.equals(transaction.getTradeState(), Transaction.TradeStateEnum.SUCCESS)){
  //處理業務邏輯
  //通知微信支付成功
  wechatPayUtil.paySuccessful(response);
}
責任編輯:姜華 來源: 今日頭條
相關推薦

2020-10-27 10:40:18

JavaAPI V3支付

2016-03-04 10:29:51

微信支付源碼

2024-04-03 12:30:00

C++開發

2024-04-24 13:45:00

2021-02-26 00:46:11

CIO數據決策數字化轉型

2025-03-13 06:50:50

2011-12-02 09:59:29

API

2023-05-24 10:06:42

多云實踐避坑

2021-05-07 21:53:44

Python 程序pyinstaller

2021-02-22 17:00:31

Service Mes微服務開發

2022-03-04 18:11:16

信服云

2021-05-08 12:30:03

Pythonexe代碼

2010-07-30 13:17:33

NFS V3

2021-04-28 09:26:25

公有云DTS工具

2020-12-16 10:00:59

Serverless數字化云原生

2018-01-20 20:46:33

2016-04-21 11:12:25

云鎖cloud云計算

2020-06-12 11:03:22

Python開發工具

2019-02-12 15:07:42

屏幕參數PC

2018-03-26 11:14:13

程序猿bug代碼
點贊
收藏

51CTO技術棧公眾號

久久露脸国语精品国产91| 天天操天天爱天天爽| 乱精品一区字幕二区| 亚洲女人av| 最新国产精品拍自在线播放| 久久综合在线观看| 涩涩视频在线播放| 亚洲日本在线观看| 久久天堂国产精品| 91好色先生tv| 国产精品视区| 美日韩丰满少妇在线观看| 亚洲日本久久久| 在线一区视频观看| 亚洲黄色av一区| 日本视频一区在线观看| 国产99视频在线| 日日夜夜精品视频天天综合网| 久久在线免费观看视频| 性色av蜜臀av色欲av| 国产精品一区二区三区四区在线观看 | 亚洲av无码久久精品色欲| 涩涩视频网站在线观看| 亚洲精品成a人| 天堂社区 天堂综合网 天堂资源最新版 | 精品嫩草影院久久| 国产免费又粗又猛又爽| 99爱在线观看| 国产精品女上位| 精品在线视频一区二区三区| 一卡二卡在线观看| 天堂av在线一区| 91精品国产99| 亚洲一区 视频| 欧美激情1区2区3区| 日韩中文字幕视频| 日韩女同一区二区三区| 日本欧美高清| 亚洲精品福利免费在线观看| 国产xxx在线观看 | 国产在线精品一区二区中文| 99久久久无码国产精品免费| 久久aⅴ国产欧美74aaa| 国产精品久久久av久久久| 制服.丝袜.亚洲.中文.综合懂色| 欧美久久影院| 欧美二区在线播放| 欧美日韩一级大片| 欧美韩国一区| 久久91超碰青草是什么| 国产av无码专区亚洲av毛网站| 精品国产一区二区三区噜噜噜| 亚洲欧美制服丝袜| 性久久久久久久久久| 色婷婷精品视频| 日韩理论片久久| 国产三级国产精品| 伊人久久大香线蕉无限次| 精品性高朝久久久久久久| jizz日本免费| 国产精品最新| 丝袜情趣国产精品| 成人欧美一区二区三区黑人一| 菠萝蜜一区二区| 精品国产拍在线观看| 三上悠亚在线观看视频| 综合激情网站| 欧美大片免费观看在线观看网站推荐| 日韩欧美中文字幕视频| 国内揄拍国内精品久久| 97视频国产在线| 亚洲影院在线播放| 日本系列欧美系列| 亚洲sss综合天堂久久| 亚洲av无码乱码国产精品久久 | 6080国产精品一区二区| 日韩av影视大全| 超碰成人在线观看| 亚洲欧洲在线视频| 51精品免费网站| 影音先锋日韩资源| 国产91色在线免费| 国产三区在线播放| 99这里都是精品| 日本一区二区三区免费看| 毛片免费不卡| 伊人性伊人情综合网| 日韩五码在线观看| 无人区在线高清完整免费版 一区二| 欧美日韩亚洲高清一区二区| 国内外成人免费在线视频| 日本免费一区二区三区视频| 亚洲精品国精品久久99热一| 久久久久99精品成人| 欧美a级片网站| 日本欧美精品在线| 精品久久久久成人码免费动漫| 91视视频在线直接观看在线看网页在线看| 欧美日韩亚洲在线| 伊人222成人综合网| 日韩欧美中文字幕在线播放| 中文字幕丰满乱码| 欧美日韩麻豆| 九九久久精品一区| 欧美一级淫片免费视频黄| 国产成人在线视频网址| 日本免费高清一区二区| 国产天堂在线播放视频| 欧美日韩视频在线一区二区| 日本人添下边视频免费| 色999日韩| 国产不卡精品视男人的天堂| 性猛交xxxx乱大交孕妇印度| 中文字幕+乱码+中文字幕一区| 国产精品一线二线三线| av在线精品| 亚洲最新在线视频| 欧美bbbbbbbbbbbb精品| 国产麻豆精品视频| 天堂资源在线亚洲视频| 在线能看的av网址| 精品裸体舞一区二区三区| 国产精品免费在线视频| 天堂久久一区二区三区| 精品一区二区三区日本| av福利导福航大全在线| 欧美一区二区视频观看视频| 少妇高潮惨叫久久久久| 视频一区视频二区中文字幕| 久草精品电影| bl在线肉h视频大尺度| 日韩一级大片在线观看| 国产日产精品一区二区三区的介绍| 日韩精品一级二级 | 国产精品爽爽爽| 国产高清在线观看| 色妞www精品视频| 久久人人爽人人爽人人片| 欧美深夜福利| 国产高清一区二区三区| 色噜噜狠狠狠综合欧洲色8| 色婷婷av一区二区| 亚洲色图欧美自拍| 在线一区电影| 91丨九色丨国产| 2024最新电影在线免费观看| 91精品欧美一区二区三区综合在 | 亚洲成人高清在线| 中文字幕无人区二| 亚洲一级高清| 久久66热这里只有精品| 日韩大片免费观看| 亚洲美女福利视频网站| 99精品人妻国产毛片| 久久综合网色—综合色88| 那种视频在线观看| 国产欧美一区二区精品久久久| 国产脚交av在线一区二区| jizz在线免费观看| 91精品在线免费观看| 久久成人国产精品入口| youjizz国产精品| av免费播放网址| 欧美精选一区二区三区| 国产精品亚洲美女av网站| 美女免费久久| 精品国产自在久精品国产| 国产奶水涨喷在线播放| 26uuu成人网一区二区三区| 91蝌蚪视频在线观看| 四季av在线一区二区三区| 2022国产精品| 理论片午夜视频在线观看| 国产一区二区三区在线| 国产免费黄色大片| 亚洲成人自拍偷拍| 日韩一区二区a片免费观看| 久久成人精品无人区| wwwjizzjizzcom| 日韩理论电影中文字幕| 国产精品嫩草视频| 性网站在线观看| 日韩高清a**址| 亚洲无码久久久久久久| 亚洲三级在线免费观看| 熟女人妻在线视频| 久久99精品久久久久久国产越南| 亚洲啊啊啊啊啊| 你懂的一区二区三区| 成人做爽爽免费视频| 啊啊啊久久久| 久久人人爽亚洲精品天堂| 国模人体一区二区| 欧美日韩在线播放一区| 国产午夜小视频| 中文字幕av一区二区三区| 国模大尺度视频| 日韩成人免费电影| 人人妻人人澡人人爽欧美一区双 | 国产精品无码电影在线观看| 免费视频一区三区| 99re国产| 亚洲18在线| 欧美一级在线亚洲天堂| av理论在线观看| 一区二区亚洲欧洲国产日韩| 国产成人手机在线| 欧美日韩的一区二区| 在线观看日本视频| 亚洲一线二线三线久久久| 手机看片福利视频| 99精品国产91久久久久久| 亚洲欧美视频二区| 欧美一级久久| 国产毛片视频网站| 亚洲欧美文学| 中文网丁香综合网| 欧美限制电影| 国产伦精品一区二区三区视频 | 国产精品久久久久久无人区| 色系网站成人免费| 日韩精品一区二区在线播放| 亚洲丝袜美腿综合| 亚洲欧洲综合网| 国产欧美综合色| 中文字幕在线看高清电影| 成人美女视频在线看| 99视频在线观看视频| 日本三级亚洲精品| 久草综合在线观看| 另类图片国产| 男人天堂999| 国产亚洲亚洲| 99精品人妻少妇一区二区 | 97精品在线视频| wwww亚洲| 午夜欧美大片免费观看| 男女羞羞视频在线观看| 九九热视频这里只有精品| 欧美日韩欧美| 久久天堂av综合合色| 香蕉视频免费在线播放| 色视频www在线播放国产成人| 阿v免费在线观看| 国产亚洲精品久久| 国产一级在线观看| 亚洲一区二区久久久| 国产高清视频免费最新在线| 亚洲人成在线播放| 国产精品久久一区二区三区不卡 | 成视频免费观看在线看| 久久在线精品视频| 欧美草逼视频| 午夜免费久久久久| 无遮挡在线观看| 日韩av免费在线看| 国产91欧美| 69堂成人精品视频免费| av不卡一区二区| 精品欧美一区二区精品久久| 男男gay无套免费视频欧美| 三区精品视频| 欧美国产一级| av在线com| 裸体一区二区| 男人添女人下面免费视频| 韩国欧美国产1区| 国内自拍偷拍视频| 久久综合久色欧美综合狠狠| 女人黄色一级片| 日韩毛片视频在线看| 国产一级aa大片毛片| 欧美日韩在线视频一区| 日韩欧美国产另类| 欧美一区二区三区白人| 蜜桃视频久久一区免费观看入口| 日韩精品免费在线视频| av在线日韩国产精品| 超碰精品一区二区三区乱码| av小说在线播放| 国产精品视频自在线| 9999久久久久| 四虎永久国产精品| 欧美伊人久久| 91av俱乐部| 成人永久免费视频| 亚洲第一视频区| 亚洲制服丝袜在线| 国产亚洲欧美日韩高清| 日韩一区二区三区视频在线观看| 水莓100国产免费av在线播放| www.欧美精品| 欧美三级网站| 91在线播放国产| 欧美猛男同性videos| 超级碰在线观看| 青青草精品视频| 免费日本黄色网址| 自拍偷拍亚洲激情| 国产成人麻豆免费观看| 精品国产三级a在线观看| 国产日产精品久久久久久婷婷| 九九热99久久久国产盗摄| av一区在线播放| 久久伊人资源站| 欧美三区美女| 九九久久久久久| 国产丝袜欧美中文另类| 欧美成人aaaaⅴ片在线看| 欧美日韩国产小视频| 欧洲伦理片一区 二区 三区| 欧美成人性生活| 四虎地址8848精品| 色综合影院在线观看| 国产亚洲精品久久久久婷婷瑜伽| 日韩欧美中文视频| 国产精品福利一区二区| 黄色片视频免费| 亚洲免费视频在线观看| 51精品在线| 国产精品v欧美精品∨日韩| 仙踪林久久久久久久999| 天美星空大象mv在线观看视频| 久久嫩草精品久久久精品| 国产午夜激情视频| 欧美成人伊人久久综合网| 国产福利视频在线观看| 国产精品一二三视频| 国产乱码精品一区二区三区四区 | 精品无码免费视频| 欧美一区二区三区四区高清| 色综合久久久久综合一本到桃花网| 国产不卡视频在线| 九九热爱视频精品视频| 久久久久久久久久久免费视频| a美女胸又www黄视频久久| 久久影院一区二区| 欧美成人video| 色屁屁www国产馆在线观看| 999视频在线观看| 欧美理论在线| 精品人妻在线视频| 亚洲成av人在线观看| 日韩在线视频第一页| 久久免费少妇高潮久久精品99| av不卡一区| 久激情内射婷内射蜜桃| 97国产一区二区| 久久久黄色大片| 一区二区三区精品99久久| 激情久久一区二区| gogogo免费高清日本写真| 国产一区二区影院| 久久久久久久久久久久国产| 亚洲第一精品福利| 亚洲v.com| 亚洲国产另类久久久精品极度| 捆绑调教美女网站视频一区| 希岛爱理中文字幕| 精品久久久久一区二区国产| 国产粉嫩在线观看| 日本高清不卡三区| 精品一区二区三区欧美| 麻豆亚洲av熟女国产一区二| 亚洲成人黄色在线观看| 九色porny自拍视频在线播放| 日本午夜精品电影| 黑人巨大精品欧美黑白配亚洲| 国产性猛交普通话对白| 日韩国产在线看| 成人一区视频| 久草视频这里只有精品| 91麻豆免费在线观看| 一区二区日韩视频| 久久久久中文字幕2018| 教室别恋欧美无删减版| 涩涩网站在线看| 午夜激情一区二区三区| 99re在线视频| 国产免费一区| 蜜桃av一区二区| 日韩乱码在线观看| 国产亚洲欧美日韩精品| 日韩免费一级| 无码内射中文字幕岛国片| 亚洲欧美日韩成人高清在线一区| 日韩一卡二卡在线| 国产精品视频网址| 亚洲国产网站| 任你操精品视频| 日韩av在线直播| 精品久久国产一区| 少妇高清精品毛片在线视频 | 激情五月婷婷网| 欧美成人剧情片在线观看| 国产亚洲一区二区三区不卡| 精品人妻一区二区三区免费| 色噜噜狠狠成人中文综合| 五月婷婷视频在线观看| 日韩av图片|