SpringBoot整合微信支付

  • 3.2 service层

  • 4.生成微信支付的二维码

    • 4.1 controller层
  • 4.2 service层

  • 5.查询订单支付状态

    • 5.1 controller层
  • 5.2 service层

SpringBoot整合微信支付

=========================================================================

1.准备工作


1.1 数据库表

这里涉及微信支付一共两个表:

订单表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hQortUQF-1639748683366)(SpringBoot整合微信支付.assets/image-20211216182500871.png)]

支付记录表

在这里插入图片描述

1.2 实体类

数据库对应的实体类:

订单表

@Data

@ToString

@EqualsAndHashCode(callSuper = false)

@Accessors(chain = true)

@TableName(“t_order”)

@ApiModel(value = “Order对象”, description = “订单”)

public class Order implements Serializable {

private static final long serialVersionUID = 1L;

@TableId(value = “id”, type = IdType.ID_WORKER_STR)

private String id;

@ApiModelProperty(value = “订单号”)

private String orderNo;

@ApiModelProperty(value = “课程id”)

private String courseId;

@ApiModelProperty(value = “课程名称”)

private String courseTitle;

@ApiModelProperty(value = “课程封面”)

private String courseCover;

@ApiModelProperty(value = “讲师名称”)

private String teacherName;

@ApiModelProperty(value = “会员id”)

private String memberId;

@ApiModelProperty(value = “会员昵称”)

private String nickname;

@ApiModelProperty(value = “会员手机”)

private String mobile;

@ApiModelProperty(value = “订单金额(分)”)

private BigDecimal totalFee;

@ApiModelProperty(value = “支付类型(1:微信 2:支付宝)”)

private Integer payType;

@ApiModelProperty(value = “订单状态(0:未支付 1:已支付)”)

private Integer status;

@ApiModelProperty(value = “逻辑删除 1(true)已删除, 0(false)未删除”)

private Boolean isDeleted;

@ApiModelProperty(value = “创建时间”)

@TableField(fill = FieldFill.INSERT)

private Date gmtCreate;

@ApiModelProperty(value = “更新时间”)

@TableField(fill = FieldFill.INSERT_UPDATE)

private Date gmtModified;

}

支付日志表

@Data

@EqualsAndHashCode(callSuper = false)

@Accessors(chain = true)

@TableName(“t_pay_log”)

@ApiModel(value = “PayLog对象”, description = “支付日志表”)

public class PayLog implements Serializable {

private static final long serialVersionUID = 1L;

@TableId(value = “id”, type = IdType.ID_WORKER_STR)

private String id;

@ApiModelProperty(value = “订单号”)

private String orderNo;

@ApiModelProperty(value = “支付完成时间”)

private Date payTime;

@ApiModelProperty(value = “支付金额(分)”)

private BigDecimal totalFee;

@ApiModelProperty(value = “交易流水号”)

private String transactionId;

@ApiModelProperty(value = “交易状态”)

private String tradeState;

@ApiModelProperty(value = “支付类型(1:微信 2:支付宝)”)

private Integer payType;

@ApiModelProperty(value = “其他属性”)

private String attr;

@ApiModelProperty(value = “逻辑删除 1(true)已删除, 0(false)未删除”)

private Boolean isDeleted;

@ApiModelProperty(value = “创建时间”)

@TableField(fill = FieldFill.INSERT)

private Date gmtCreate;

@ApiModelProperty(value = “更新时间”)

@TableField(fill = FieldFill.INSERT_UPDATE)

private Date gmtModified;

}

1.3 导入依赖

在订单模块service_order导入微信支付需要的依赖:

com.github.wxpay

wxpay-sdk

0.0.3

com.alibaba

fastjson

1.4 配置文件

在配置文件application.properties配置相关的信息:

服务端口

server.port=8007

服务名

spring.application.name=service-order

mysql数据库连接

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/guli?serverTimezone=GMT%2B8

spring.datasource.username=root

spring.datasource.password=root

#返回json的全局时间格式

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss

spring.jackson.time-zone=GMT+8

#配置mapper xml文件的路径

mybatis-plus.mapper-locations=classpath:com/atguigu/eduorder/mapper/xml/*.xml

#mybatis日志

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

nacos服务地址

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

#开启熔断机制

#feign.hystrix.enabled=true

设置hystrix超时时间,默认1000ms

#hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000

#关联的公众号appid

wx.pay.app_id=wx74862e0dfc69954

#商户号

wx.pay.partner=155895011

#商户key

wx.pay.partnerkey=T6m9iK73b0kn9g5v426MKHQH7X8rKwb

#回调地址

wx.pay.notifyurl=http://guli.shop/api/order/weixinPay/weixinNotify

#微信提供的固定地址

wx.pay.wxurl=https://api.mch.weixin.qq.com/pay/unifiedorder

#微信查询状态地址

wx.pay.queryUrl=https://api.mch.weixin.qq.com/pay/orderquery

1.5 创建读取微信支付相关信息的工具类

创建一个读取微信支付需要的信息的工具类ConstantWxPayUtils

@Controller

public class ConstantWxPayUtils implements InitializingBean {

@Value(“${wx.pay.app_id}”)

private String appID;

@Value(“${wx.pay.partner}”)

private String partner;

@Value(“${wx.pay.partnerkey}”)

private String partnerKey;

@Value(“${wx.pay.notifyurl}”)

private String notifyUrl;

@Value(“${wx.pay.wxurl}”)

private String wxUrl;

@Value(“${wx.pay.queryUrl}”)

private String queryUrl;

//定义公共静态常量

public static String WX_PAY_APP_ID;

public static String WX_PAY_PARTNER;

public static String WX_PAY_PARTNER_KEY;

public static String WX_PAY_NOTIFY_URL;

public static String WX_PAY_WX_URL;

public static String WX_PAY_QUERY_URL;

@Override

public void afterPropertiesSet() throws Exception {

WX_PAY_APP_ID = appID;

WX_PAY_PARTNER = partner;

WX_PAY_PARTNER_KEY = partnerKey;

WX_PAY_NOTIFY_URL = notifyUrl;

WX_PAY_WX_URL = wxUrl;

WX_PAY_QUERY_URL=queryUrl;

}

}

1.6 其他工具类

用于随机生成订单号的工具类OrderNoUtil

public class OrderNoUtil {

/**

  • 获取订单号

  • @return

*/

public static String getOrderNo() {

SimpleDateFormat sdf = new SimpleDateFormat(“yyyyMMddHHmmss”);

String newDate = sdf.format(new Date());

String result = “”;

Random random = new Random();

for (int i = 0; i < 3; i++) {

result += random.nextInt(10);

}

return newDate + result;

}

}

HttpClient工具类:

/**

  • http请求客户端

  • @author xppll

*/

public class HttpClient {

private String url;

private Map<String, String> param;

private int statusCode;

private String content;

private String xmlParam;

private boolean isHttps;

public boolean isHttps() {

return isHttps;

}

public void setHttps(boolean isHttps) {

this.isHttps = isHttps;

}

public String getXmlParam() {

return xmlParam;

}

public void setXmlParam(String xmlParam) {

this.xmlParam = xmlParam;

}

public HttpClient(String url, Map<String, String> param) {

this.url = url;

this.param = param;

}

public HttpClient(String url) {

this.url = url;

}

public void setParameter(Map<String, String> map) {

param = map;

}

public void addParameter(String key, String value) {

if (param == null)

param = new HashMap<String, String>();

param.put(key, value);

}

public void post() throws ClientProtocolException, IOException {

HttpPost http = new HttpPost(url);

setEntity(http);

execute(http);

}

public void put() throws ClientProtocolException, IOException {

HttpPut http = new HttpPut(url);

setEntity(http);

execute(http);

}

public void get() throws ClientProtocolException, IOException {

if (param != null) {

StringBuilder url = new StringBuilder(this.url);

boolean isFirst = true;

for (String key : param.keySet()) {

if (isFirst)

url.append(“?”);

else

url.append(“&”);

url.append(key).append(“=”).append(param.get(key));

}

this.url = url.toString();

}

HttpGet http = new HttpGet(url);

execute(http);

}

/**

  • set http post,put param

*/

private void setEntity(HttpEntityEnclosingRequestBase http) {

if (param != null) {

List nvps = new LinkedList();

for (String key : param.keySet())

nvps.add(new BasicNameValuePair(key, param.get(key))); // 参数

http.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8)); // 设置参数

}

if (xmlParam != null) {

http.setEntity(new StringEntity(xmlParam, Consts.UTF_8));

}

}

private void execute(HttpUriRequest http) throws ClientProtocolException,

IOException {

CloseableHttpClient httpClient = null;

try {

if (isHttps) {

SSLContext sslContext = new SSLContextBuilder()

.loadTrustMaterial(null, new TrustStrategy() {

// 信任所有

public boolean isTrusted(X509Certificate[] chain,

String authType)

throws CertificateException {

return true;

}

}).build();

SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(

sslContext);

httpClient = HttpClients.custom().setSSLSocketFactory(sslsf)

.build();

} else {

httpClient = HttpClients.createDefault();

}

CloseableHttpResponse response = httpClient.execute(http);

try {

if (response != null) {

if (response.getStatusLine() != null)

statusCode = response.getStatusLine().getStatusCode();

HttpEntity entity = response.getEntity();

// 响应内容

content = EntityUtils.toString(entity, Consts.UTF_8);

}

} finally {

response.close();

}

} catch (Exception e) {

e.printStackTrace();

} finally {

httpClient.close();

}

}

public int getStatusCode() {

return statusCode;

}

public String getContent() throws ParseException, IOException {

return content;

}

}

2.生成订单


这里一共涉及service_order订单模块、service_ucenter用户模块、service-edu课程模块。

service_order使用Fegin远程调用其他模块的方法。

详细的Fegin的使用可以参考:SpringCloud-Feign远程调用

2.1 远程调用用户模块和课程模块

service_order订单模块创建:

@Component

@FeignClient(“service-ucenter”) //调用的服务名称

public interface UcenterClient {

//根据用户id获取用户信息,用于生成订单使用

@PostMapping(“/educenter/member/getUserInfoOrder/{id}”)

public UcenterMemberOrder getUserInfoOrder(@PathVariable(“id”) String id);

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

作为过来人,小编是整理了很多进阶架构视频资料、面试文档以及PDF的学习资料,针对上面一套系统大纲小编也有对应的相关进阶架构视频资料


《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
过华为、OPPO等大厂,18年进入阿里一直到现在。**

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-qD2DMQf3-1712079445293)]

[外链图片转存中…(img-j5I95G9F-1712079445294)]

[外链图片转存中…(img-U1KrvsiJ-1712079445294)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

作为过来人,小编是整理了很多进阶架构视频资料、面试文档以及PDF的学习资料,针对上面一套系统大纲小编也有对应的相关进阶架构视频资料

[外链图片转存中…(img-vZp1uh8H-1712079445294)]
[外链图片转存中…(img-IF6HjZEE-1712079445295)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值