SpringBoot实现微信扫码支付starter封装?

编程入门 行业动态 更新时间:2024-10-24 04:50:03

<a href=https://www.elefans.com/category/jswz/34/1769943.html style=SpringBoot实现微信扫码支付starter封装?"/>

SpringBoot实现微信扫码支付starter封装?

SpringBoot实现微信扫码支付starter封装?

更新时间:2023-09-01 来源:黑马程序员 浏览量:1155

基于启动类上的注解@SpringBootApplication中的@EnableAutoConfiguration来开启自动化配置,这个注解通过@Import来导入了配置类,如下图所示:

上述配置类会加载所有jar包以及源码下的META-INF下得spring.factories文件,如下图所示:
 

然后会加载配置中指定的自动化配置key所对应的所有自动化配置类,示例如下图所示:

但是自动化配置类并不是都需要加载的,springBoot通过自动化配置类上添加的各种条件注解@Conditional来判断这个自动化配置类是否满足条件,如果满足条件,即加载配置类,如下图webmvc自动化配置类示例:

微信扫码支付starter封装

流程分析--逆向思维

我们最终需要能够实现的目的 -->引入依赖,yaml中做好配置,直接依赖注入xxxTemplate能够直接使用。

--->需要创建一个xxxTemplate对象---> 提供一个xxxTemplate类,封装扫码支付的api,一些环境级别的参数做成配置。

--> 提供xxxProperties配置类,然后加载yaml中的配置。

实现步骤整理

01.创建工程,引入相关依赖

提供WxPayProperties配置类,用于加载application.yaml中的环境配置

提供WxPayTemplate类,封装扫码支付的api,环境配置依赖注入得到

提供配置类,启动WxPayProperties类对象,创建WxPayTemplate对象

提供META-INF/spring.factory配置类,配置自动化配置

创建新测试工程,测试starter使用

代码实现

1.创建工程,引入相关依赖

<dependencies><dependency><groupId>com.github.wechatpay-apiv3</groupId><artifactId>wechatpay-apache-httpclient</artifactId><version>0.4.9</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency></dependencies>

提供WxPayProperties配置类,用于加载application.yaml中的环境配置

package com.heima.wxpay.config;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Data
@ConfigurationProperties(prefix = "wxpay")
public class WxPayProperties {private String mchId = "1561414331"; //商户号//private String appId = "wx6592a2db3f85ed25"; //应用号private String appId = "wxffb3637a228223b8"; //应用号private String privateKey = "-----BEGIN PRIVATE KEY-----\n" +"MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDBHGgIh80193Gh\n" +"dpD1LtMZfTRpcWI0fImyuBCyrd3gYb3rrsARebGcHdJsQA3mVjVqVp5ybhEZDPa4\n" +"ecoK4Ye1hTppNpI/lmLt4/uUV/zhF5ahli7hi+116Ty6svHSbuMQBuUZeTFOwGrx\n" +"jvofU/4pGIwh8ZvkcSnyOp9uX2177UVxDBkhgbZbJp9XF2b83vUa5eHo93CziPzn\n" +"3hFdAlBCdTXB7DH+m0nN3Jou0szGukvq7cIgGpHku4ycKSTkIhhl9WRhN6OoSEJx\n" +"q88MXzjkzTruc85PHN52aUTUifwg3T8Y4XqFQ61dTnEmgxeD2O6/pLdB9gLsp6yC\n" +"GqN5Lqk7AgMBAAECggEBAL4X+WzUSbSjFS9NKNrCMjm4H1zgqTxjj6TnPkC1mGEl\n" +"tjAHwLgzJBw62wWGdGhWWpSIGccpBBm1wjTMZpAZfF66fEpP1t1Ta6UjtGZNyvfF\n" +"IZmE3jdWZ/WXGBnsxtFQKKKBNwrBW0Fbdqq9BQjLxLitmlxbmwrgPttcy855j6vZ\n" +"qq4MBT1v8CtUT/gz4UWW2xWovVnmWOrRSScv7Nh0pMbRpPLkNHXrBwSSNz/keORz\n" +"XB9JSm85wlkafa7n5/IJbdTml3A/uAgW3q3JZZQotHxQsYvD4Zb5Cnc9CPAXE5L2\n" +"Yk877kVXZMGt5QPIVcPMj/72AMtaJT67Y0fN0RYHEGkCgYEA38BIGDY6pePgPbxB\n" +"7N/l6Df0/OKPP0u8mqR4Q0aQD3VxeGiZUN1uWXEFKsKwlOxLfIFIFk1/6zQeC0xe\n" +"tNTKk0gTL8hpMUTNkE7vI9gFWws2LY6DE86Lm0bdFEIwh6d7Fr7zZtyQKPzMsesC\n" +"3XV9sdSUExEi5o/VwAyf+xZlOXcCgYEA3PGZYlILjg3esPNkhDz2wxFw432i8l/B\n" +"CPD8ZtqIV9eguu4fVtFYcUVfawBb0T11RamJkc4eiSOqayC+2ehgb+GyRLJNK4Fq\n" +"bFcsIT+CK0HlscZw51jrMR0MxTc4RzuOIMoYDeZqeGB6/YnNyG4pw2sD8bIwHm84\n" +"06gtJsX/v10CgYAo8g3/aEUZQHcztPS3fU2cTkkl0ev24Ew2XGypmwsX2R0XtMSB\n" +"uNPNyFHyvkgEKK2zrhDcC/ihuRraZHJcUyhzBViFgP5HBtk7VEaM36YzP/z9Hzw7\n" +"bqu7kZ85atdoq6xpwC3Yn/o9le17jY8rqamD1mv2hUdGvAGYsHbCQxnpBwKBgHTk\n" +"eaMUBzr7yZLS4p435tHje1dQVBJpaKaDYPZFrhbTZR0g+IGlNmaPLmFdCjbUjiPy\n" +"A2+Znnwt227cHz0IfWUUAo3ny3419QkmwZlBkWuzbIO2mms7lwsf9G6uvV6qepKM\n" +"eVd5TWEsokVbT/03k27pQmfwPxcK/wS0GFdIL/udAoGAOYdDqY5/aadWCyhzTGI6\n" +"qXPLvC+fsJBPhK2RXyc+jYV0KmrEv4ewxlK5NksuFsNkyB7wlI1oMCa/xB3T/2vT\n" +"BALgGFPi8BJqceUjtnTYtI4R2JIVEl08RtEJwyU5JZ2rvWcilsotVZYwfuLZ9Kfd\n" +"hkTrgNxlp/KKkr+UuKce4Vs=\n" +"-----END PRIVATE KEY-----\n"; //私钥字符串private String mchSerialNo = "25FBDE3EFD31B03A4377EB9A4A47C517969E6620"; //商户证书序列号private String apiV3Key = "CZBK51236435wxpay435434323FFDuv3"; //V3密钥}

提供WxPayTemplate类,封装扫码支付的api,环境配置依赖注入得到。

2个参数实体类:

package com.heima.wxpay.dto;import lombok.Builder;
import lombok.Data;@Builder
@Data
public class NativePayParams {private String appid; // 应用idprivate String mchid;  // 商户idprivate String description; //商品描述private String out_trade_no; //订单号private String notify_url; // 支付成功回调通知地址private Amount amount; //订单金额信息
}
package com.heima.wxpay.dto;import lombok.Builder;
import lombok.Data;@Builder
@Data
public class Amount {private Integer total;private String currency;
}

工具类:

package com.heima.wxpay.config;import com.alibaba.fastjson.JSON;
import com.heima.wxpay.dto.Amount;
import com.heima.wxpay.dto.NativePayParams;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.util.EntityUtils;import java.io.IOException;
import java.util.Map;public class WxPayTemplate {private WxPayProperties wxPayProperties;private CloseableHttpClient httpClient;public WxPayTemplate(WxPayProperties wxPayProperties,CloseableHttpClient httpClient) {this.wxPayProperties = wxPayProperties;this.httpClient = httpClient;}public String nativePay(Integer total, String description, String outTradeNo) throws Exception{HttpPost httpPost = new HttpPost("");// 请求body参数Amount amount = Amount.builder().currency("CNY").total(total).build();NativePayParams nativePayParams = NativePayParams.builder().appid(wxPayProperties.getAppId()).description(description).mchid(wxPayProperties.getMchId()).notify_url("/native/notify").out_trade_no(outTradeNo).amount(amount).build();String reqdata = JSON.toJSONString(nativePayParams);StringEntity entity = new StringEntity(reqdata,"utf-8");entity.setContentType("application/json");httpPost.setEntity(entity);httpPost.setHeader("Accept", "application/json");//完成签名并执行请求CloseableHttpResponse response = httpClient.execute(httpPost);String url = "";try {int statusCode = response.getStatusLine().getStatusCode();if (statusCode == 200) { //处理成功System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));url = JSON.parseObject( EntityUtils.toString(response.getEntity()), Map.class).get("code_url").toString();} else if (statusCode == 204) { //处理成功,无返回BodySystem.out.println("success");} else {System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));throw new IOException("request failed");}} finally {response.close();}return url;}
}

提供配置类,启动WxPayProperties类对象,创建WxPayTemplate对象。

package com.heima.wxpay.config;import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
import com.wechat.pay.contrib.apache.httpclient.auth.AutoUpdateCertificatesVerifier;
import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner;
import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials;
import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator;
import com.wechat.pay.contrib.apache.httpclient.util.PemUtil;
import org.apache.http.impl.client.CloseableHttpClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.io.ByteArrayInputStream;
import java.security.PrivateKey;@Configuration
@EnableConfigurationProperties(WxPayProperties.class)
public class WxPayAutoConfig {@Beanpublic CloseableHttpClient httpClient(WxPayProperties wxPayProperties) throws Exception{// 加载商户私钥(privateKey:私钥字符串)PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(new ByteArrayInputStream(wxPayProperties.getPrivateKey().getBytes("utf-8")));// 加载平台证书(mchId:商户号,mchSerialNo:商户证书序列号,apiV3Key:V3密钥)AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(new WechatPay2Credentials(wxPayProperties.getMchId(), new PrivateKeySigner(wxPayProperties.getMchSerialNo(), merchantPrivateKey)),wxPayProperties.getApiV3Key().getBytes("utf-8"));// 初始化httpClientreturn WechatPayHttpClientBuilder.create().withMerchant(wxPayProperties.getMchId(), wxPayProperties.getMchSerialNo(), merchantPrivateKey).withValidator(new WechatPay2Validator(verifier)).build();}@Beanpublic WxPayTemplate wxPayTemplate(WxPayProperties wxPayProperties,CloseableHttpClient httpClient){return new WxPayTemplate(wxPayProperties,httpClient);}}

提供META-INF/spring.factory配置类,配置自动化配置

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.heima.wxpay.config.WxPayAutoConfig

创建新测试工程,测试starter使用,导入starter依赖:

<dependency><groupId>com.heima</groupId><artifactId>wx_pay_starter</artifactId><version>1.0-SNAPSHOT</version>
</dependency>

直接springBoot测试

package com.itheima.wxpay;import com.heima.wxpay.config.WxPayTemplate;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class StarterTest {@Autowiredprivate WxPayTemplate wxPayTemplate;@Testpublic void testNativePay() throws Exception{String url = wxPayTemplate.nativePay(1, "javaEE企业级开发", "ADFADSFS4353534");System.out.println(url);}

更多推荐

SpringBoot实现微信扫码支付starter封装?

本文发布于:2024-03-08 21:30:49,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1722447.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:SpringBoot   微信扫码   starter

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!