SpringBoot + 微信公眾號(hào)JSAPI支付功能的實(shí)現(xiàn)
1、pom.xml依賴(lài)配置
<!-- 微信支付 --><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: # 商戶(hù)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ù)號(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')@Slf4jpublic class WechatPayController { @Autowired WechatPayConfig wechatPayConfig; private PayService service = null; @PostConstruct public void init() { WxPayConfigStorage wxPayConfigStorage = new WxPayConfigStorage(); wxPayConfigStorage.setMchId(wechatPayConfig.getMchId()); // 合作者id(商戶(hù)號(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)接口名稱(chēng) 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('商品名稱(chēng)'); payOrder.setBody('商品描述'); payOrder.setAddition('附加信息'); payOrder.setPrice(new BigDecimal(0.2));// 價(jià)格 payOrder.setOutTradeNo('商戶(hù)訂單號(hào)'); payOrder.setBankType('銀行卡類(lèi)型'); payOrder.setDeviceInfo('設(shè)備信息'); payOrder.setSpbillCreateIp('支付創(chuàng)建ip');// 可用IPUtils.getIpAddr(request) payOrder.setOpenid('用戶(hù)微信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ù)單號(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)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章: