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

SpringBoot + 微信公眾號(hào)JSAPI支付功能的實(shí)現(xiàn)

 更新時(shí)間:2021年03月26日 09:28:40   作者:開(kāi)心的小馬甲  
這篇文章主要介紹了SpringBoot + 微信公眾號(hào)JSAPI支付功能的實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1、pom.xml依賴配置

<!-- 微信支付 -->
<dependency>
  <groupId>com.egzosn</groupId>
  <artifactId>pay-java-wx</artifactId>
  <version>2.12.4</version>
</dependency>

2、application.yml文件配置微信公眾號(hào)的基礎(chǔ)信息

#微信公眾號(hào)支付配置
wechatpay:
 mchId: # 商戶Id
 appId: #應(yīng)用id
 storePassword: #秘鑰支付密碼
 secretKey: # 密鑰
 notifyUrl: #微信支付回調(diào)
 keyStore:  # 證書(shū)所在位置

3、設(shè)置配置文件 WechatPayConfig.java

package com.example.emoticon.wechat;
 
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
 
/**
 * @ClassName WechatPayConfig
 * @Description 微信支付配置
 * @Author WangJing
 * @Date 2021/3/23 4:38 下午
 * @Version V1.1.0
 */
 
@Data
@Component
@ConfigurationProperties(prefix = "wechatpay")
public class WechatPayConfig {
 
  private String mchId;//合作者id(商戶號(hào)
 
  private String appId;//應(yīng)用id
 
  private String secretKey;//密鑰
 
  private String notifyUrl;
  private String keyStore;// 支付密鑰存放位置 文件是以.p12為后綴名字
  private String storePassword;
 
}

4、controller 邏輯代碼

package com.example.emoticon.controller;
 
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.PayOrder;
import com.egzosn.pay.common.bean.RefundOrder;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.common.util.sign.SignUtils;
import com.egzosn.pay.wx.api.WxPayConfigStorage;
import com.egzosn.pay.wx.api.WxPayService;
import com.egzosn.pay.wx.bean.WxTransactionType;
import com.example.emoticon.wechat.WechatPayConfig;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
 
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;
 
/**
 * @ClassName WechatPayController
 * @Description 微信支付Controller
 * @Author WangJing
 * @Date 2021/3/23 4:35 下午
 * @Version V1.1.0
 */
@RestController
@RequestMapping("/wechatPay")
@Slf4j
public class WechatPayController {
 
 
  @Autowired
  WechatPayConfig wechatPayConfig;
 
  private PayService service = null;
 
  @PostConstruct
  public void init() {
    WxPayConfigStorage wxPayConfigStorage = new WxPayConfigStorage();
    wxPayConfigStorage.setMchId(wechatPayConfig.getMchId()); // 合作者id(商戶號(hào)
    wxPayConfigStorage.setAppid(wechatPayConfig.getAppId()); // 應(yīng)用id
    wxPayConfigStorage.setSecretKey(wechatPayConfig.getSecretKey()); // 密鑰
    wxPayConfigStorage.setNotifyUrl(wechatPayConfig.getNotifyUrl()); // 異步回調(diào)地址 http://域名:端口號(hào)/項(xiàng)目名/回調(diào)接口名稱
    wxPayConfigStorage.setSignType(SignUtils.MD5.name());
    wxPayConfigStorage.setInputCharset("utf-8");
    // 支付api證書(shū)設(shè)置,退款必須 方式一
    HttpConfigStorage httpConfigStorage = new HttpConfigStorage();
    httpConfigStorage.setKeystore(wechatPayConfig.getKeyStore());// 支付密鑰存放位置 文件是以.p12為后綴名字
    httpConfigStorage.setStorePassword(wechatPayConfig.getStorePassword());
    // 是否為證書(shū)地址
    httpConfigStorage.setPath(true);
    service = new WxPayService(wxPayConfigStorage, httpConfigStorage);
    // 請(qǐng)求連接池配置
    // 最大連接數(shù)
    httpConfigStorage.setMaxTotal(20);
    // 默認(rèn)的每個(gè)路由的最大連接數(shù)
    httpConfigStorage.setDefaultMaxPerRoute(10);
    service.setRequestTemplateConfigStorage(httpConfigStorage);
  }
 
  @ApiOperation("返回訂單信息")
  @RequestMapping(value = "weixinpay", method = RequestMethod.POST)
  public Map<String, Object> weixinpay(HttpServletRequest request) {
    //備注:這個(gè)可以獲取預(yù)支付的訂單,根據(jù)需要調(diào)用這個(gè)接口,可有前臺(tái)向后臺(tái)傳遞參數(shù)。然后后臺(tái)根據(jù)需要進(jìn)行處理。
    init();
    // 在這一步,可以傳入一個(gè)訂單Id,自行去搜索訂單信息,并填寫(xiě)以下內(nèi)容
    PayOrder payOrder = new PayOrder();// 這個(gè)就是支付成功后,在微信支付里面返回的信息(支付訂單信息)
    // 一下內(nèi)容需要分情況而定,自行填寫(xiě)。
    payOrder.setSubject("商品名稱");
    payOrder.setBody("商品描述");
    payOrder.setAddition("附加信息");
    payOrder.setPrice(new BigDecimal(0.2));// 價(jià)格
    payOrder.setOutTradeNo("商戶訂單號(hào)");
    payOrder.setBankType("銀行卡類型");
    payOrder.setDeviceInfo("設(shè)備信息");
    payOrder.setSpbillCreateIp("支付創(chuàng)建ip");// 可用IPUtils.getIpAddr(request)
    payOrder.setOpenid("用戶微信openid");
    payOrder.setTransactionType(WxTransactionType.JSAPI);// 支付方式
    Map orderInfo = service.orderInfo(payOrder);// 返回創(chuàng)建的訂單信息
    log.debug("獲取預(yù)支付訂單信息回參" + orderInfo.toString());
    // 可自行選擇 ,是否將支付的流水插入到數(shù)據(jù)庫(kù)中。返回的信息由:signType appId timeStamp nonceStr package sign
    return orderInfo;
  }
 
  /**
   * 這就是支付回調(diào)地址
   *
   * @param request
   * @return
   * @throws IOException
   */
  @ApiOperation("回調(diào)地址")
  @RequestMapping(value = "weixinpayBack")
  public String payBack(HttpServletRequest request) throws IOException {
    init();
    // 獲取支付方返回的對(duì)應(yīng)參數(shù)
    Map<String, Object> params = service.getParameter2Map(request.getParameterMap(), request.getInputStream());
    if (null == params) {
      log.debug("通知失敗");
      return service.getPayOutMessage("failed", "通知失敗").toMessage();
    }
    log.debug("微信公眾號(hào)支付結(jié)果通知:" + params.toString());
    // 校驗(yàn)
    if (service.verify(params)) {
      // 這里處理業(yè)務(wù)邏輯 支付成功后的代碼邏輯塊
      // ......業(yè)務(wù)邏輯處理塊........
      log.debug("通知支付成功");
      return service.getPayOutMessage("success", "支付成功").toMessage();
    }
    log.debug("通知支付失敗");
    return service.getPayOutMessage("fail", "支付失敗").toMessage();
  }
 
 
  @ApiOperation("微信公眾號(hào)退款")
  @RequestMapping(value = "weixinAccRefund")
  public String weixinRefund() {
    init();
    RefundOrder refundOrder = new RefundOrder();//退款訂單信息
    refundOrder.setRefundNo("退款單號(hào),每次進(jìn)行退款的單號(hào),此處唯一");
    refundOrder.setTradeNo("支付平臺(tái)訂單號(hào),交易號(hào)");
    refundOrder.setOutTradeNo("商戶單號(hào)");
    refundOrder.setRefundAmount(new BigDecimal(0.2));//退款金額
    refundOrder.setTotalAmount(new BigDecimal(0.5));//訂單總金額
    refundOrder.setOrderDate(new Date());//退款交易日期
    refundOrder.setDescription("退款說(shuō)明");
    Map<String, Object> refund = service.refund(refundOrder);//微信退款
    //退款成功后,寫(xiě)其他的邏輯
    log.debug("微信公眾號(hào)退款結(jié)果:=" + refund.toString());
 
    return "Success";
 
  }
}

到此這篇關(guān)于SpringBoot + 微信公眾號(hào)JSAPI支付功能的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot 微信公眾號(hào)JSAPI支付內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

北流市| 武鸣县| 调兵山市| 阿鲁科尔沁旗| 江永县| 将乐县| 元谋县| 丹凤县| 凤翔县| 开鲁县| 阳城县| 耿马| 靖宇县| 咸宁市| 毕节市| 西宁市| 五常市| 新田县| 安西县| 塔城市| 西藏| 小金县| 当涂县| 吉安县| 循化| 永新县| 琼中| 河北区| 广东省| 神农架林区| 黎平县| 武胜县| 彰化县| 九寨沟县| 连江县| 巴塘县| 新乐市| 连南| 广河县| 龙州县| 彭山县|