<h2>一、首先导入生成二维码和微信支付环境<br>
</h2>
<div class="blockcode">
<pre class="brush:xml;">
<!-- 生成二维码工具 -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.2.0</version>
</dependency>
<!-- 微信支付所需sdk -->
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency></pre>
</div>
<h2>二、在application.yml文件配置微信所有需的基本配置<br>
</h2>
<h3>1.导入<br>
</h3>
<p>代码如下(示例):</p>
<div class="blockcode">
<pre class="brush:plain;">
# 服务器域名地址
server:
service-domain: //这里写你的域名地址
#微信app支付
pay:
wxpay:
app:
appID: 微信appid
mchID: 商户号
key: //这个key实在微信支付公众品台自己定义的key 要求36位
certPath: static/cert/wxpay/apiclient_cert.p12 # 从微信商户平台下载的安全证书存放的路径、我放在resources下面,切记一定要看看target目录下的class文件下有没有打包apiclient_cert.p12文件
payNotifyUrl: # 微信支付成功的异步通知接口 这里引入你的回调接口。
//这里直接写https://域名:端口/接口地址,注意一定是线上的接口,因为微信访问不到你本地的接口
</pre>
</div>
<h3>2.创建MyWXPayConfig类引入配置信息<br>
</h3>
<p>代码如下(示例):</p>
<div class="blockcode">
<pre class="brush:java;">
package com.example.gasstation.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.io.InputStream;
@Data
@Component
@ConfigurationProperties(prefix = "pay.wxpay.app")
public class MyWXPayConfig implements WXPayConfig{
/**
* appID
*/
private String appID;
/**
* 商户号
*/
private String mchID;
/**
* API 密钥
*/
private String key;
/**
* API证书绝对路径 (本项目放在了 resources/cert/wxpay/apiclient_cert.p12")
*/
private String certPath;
/**
* HTTP(S) 连接超时时间,单位毫秒
*/
private int httpConnectTimeoutMs = 8000;
/**
* HTTP(S) 读数据超时时间,单位毫秒
*/
private int httpReadTimeoutMs = 10000;
/**
* 微信支付异步通知地址
*/
private String payNotifyUrl;
/**
* 微信退款异步通知地址
*/
private String refundNotifyUrl;
/**
* 统一下单url
*/
private final String UNIFIED_ORDER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
/** 这里实现了一个service层**/
@Override
public InputStream getCertStream() {
InputStream certStream =getClass().getClassLoader().getResourceAsStream(certPath);
return certStream;
}
//在同层级下面新建WXPayConfig service层
package com.example.gasstation.config;
import java.io.InputStream;
public interface WXPayConfig {
InputStream getCertStream();//不要问我为啥不另起一行,因为我懒
}
}</pre>
</div>
<h2>三、引入 WxPayServiceImpl 实现类<br>
</h2>
<div class="blockcode">
<pre class="brush:java;">
package com.example.gasstation.server.impl;
import com.example.gasstation.config.MyWXPayConfig;
import com.example.gasstation.entity.Result;
import com.example.gasstation.mapper.PayMapper;
import com.example.gasstation.model.Money_transfer;
import com.example.gasstation.model.Pay;
import com.example.gasstation.server.WxPayService;
import com.example.gasstation.util.HttpClientUtil;
import com.example.gasstation.util.WXPayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
@Service
public class WxPayServiceImpl implements WxPayService {
@Autowired
private MyWXPayConfig wxPayAppConfig;
@Autowired
private PayMapper payMapper;
@Override
public String save(String orderNo, double amount, String body,Integer uid) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
// 1. 生成订单
// 订单号,流水号,金额,付款状态,创建时间
String product_id = WXPayUtils.generateUUID();
Pay pay = new Pay();//这里新建一个实体类 用处存入数据库
pay.setTradeNo(product_id);
pay.setOutTradeNo(orderNo);
pay.setBody(body);
pay.setPaystatus(1);
pay.setUid(uid);
pay.setTotalAmount(amount);
pay.setGmtCreate(df.format(new Date()));
pay.setTradeStatus("0");
pay.setAppId(wxPayAppConfig.getAppID());
// 生成预支付订单,保存到数据库
payMapper.insert(pay);
// 调用统一下单方法,返回 codeUrl 地址
String codeUrl = unifiedOrder(product_id,orderNo,amount,body);
return codeUrl;
}
priva |
|