SpringBoot微信扫码支付的实现示例

论坛 期权论坛     
niminba   2021-5-22 18:29   42   0
<h2>一、首先导入生成二维码和微信支付环境<br>
</h2>
<div class="blockcode">
<pre class="brush:xml;">
    &lt;!-- 生成二维码工具 --&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;com.google.zxing&lt;/groupId&gt;
      &lt;artifactId&gt;core&lt;/artifactId&gt;
      &lt;version&gt;3.2.1&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;com.google.zxing&lt;/groupId&gt;
      &lt;artifactId&gt;javase&lt;/artifactId&gt;
      &lt;version&gt;3.2.0&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;!-- 微信支付所需sdk --&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;com.github.wxpay&lt;/groupId&gt;
      &lt;artifactId&gt;wxpay-sdk&lt;/artifactId&gt;
      &lt;version&gt;0.0.3&lt;/version&gt;
    &lt;/dependency&gt;</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
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP