陈沧波 發表於 2023-5-22 22:08:00

微信小程序集成微信支付开发,后端是springboot项目

<h1>一、准备工作</h1>
<p>首先是进入到小程序后台关联微信支付商户、以及接入微信支付申请</p>
<p><img src="https://img2023.cnblogs.com/blog/1112095/202305/1112095-20230522215125122-291723166.png"></p>
<p>&nbsp;</p>
<p><img src="https://img2023.cnblogs.com/blog/1112095/202305/1112095-20230522215245729-592459557.png"></p>
<h1>二、小程序端代码</h1>
<p>主要是用到了 wx.requestPayment API</p>
<h2>2.1 在wxml文件中添加支付按钮</h2>
<pre class="code-block-wrapper"><code class="hljs code-block-body html"><span class="hljs-tag">&lt;<span class="hljs-name">button <span class="hljs-attr">bindtap=<span class="hljs-string">"requestPayment"&gt;支付<span class="hljs-tag">&lt;/<span class="hljs-name">button&gt;
</span></span></span></span></span></span></code></pre>
<h2>2.2 在wxss文件中定义支付按钮样式</h2>
<pre class="code-block-wrapper"><code class="hljs code-block-body css"><span class="hljs-selector-tag">button {
<span class="hljs-attribute">background-color: <span class="hljs-number">#00bfff;
<span class="hljs-attribute">color: <span class="hljs-number">#fff;
<span class="hljs-attribute">border: none;
<span class="hljs-attribute">border-radius: <span class="hljs-number">4px;
<span class="hljs-attribute">padding: <span class="hljs-number">10rpx;
<span class="hljs-attribute">font-size: <span class="hljs-number">16rpx;
}
</span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2>2.3 在js文件中编写调起支付接口的函数</h2>
<pre class="code-block-wrapper"><code class="hljs code-block-body javascript"><span class="hljs-keyword">const app = <span class="hljs-title function_">getApp();

<span class="hljs-title class_">Page({
<span class="hljs-attr">data: {
    <span class="hljs-comment">// 支付参数
    <span class="hljs-attr">paymentParams: {}
},

<span class="hljs-comment">// 点击支付按钮触发的函数
<span class="hljs-title function_">requestPayment(<span class="hljs-params">) {
    wx.<span class="hljs-title function_">request({
      <span class="hljs-attr">url: <span class="hljs-string">'https://yourdomain.com/user/createOrder', <span class="hljs-comment">// 后端服务获取支付参数
      <span class="hljs-attr">success: <span class="hljs-function">(<span class="hljs-params">res) =&gt; {
      <span class="hljs-keyword">const paymentParams = res.<span class="hljs-property">data.<span class="hljs-property">paymentParams;
      wx.<span class="hljs-title function_">requestPayment({
          <span class="hljs-attr">nonceStr: paymentParams.<span class="hljs-property">nonceStr,
          <span class="hljs-attr">package: paymentParams.<span class="hljs-property">package,
          <span class="hljs-attr">paySign: paymentParams.<span class="hljs-property">paySign,
          <span class="hljs-attr">signType: paymentParams.<span class="hljs-property">signType,
          <span class="hljs-attr">timeStamp: paymentParams.<span class="hljs-property">timeStamp,
          <span class="hljs-attr">success: <span class="hljs-function">(<span class="hljs-params">res) =&gt; {
            <span class="hljs-comment">// 支付成功后的处理逻辑
          },
          <span class="hljs-attr">fail: <span class="hljs-function">(<span class="hljs-params">res) =&gt; {
            <span class="hljs-comment">// 支付失败后的处理逻辑
          }
      })
      },
      <span class="hljs-attr">fail: <span class="hljs-function">(<span class="hljs-params">res) =&gt; {
      <span class="hljs-comment">// 获取支付参数失败后的处理逻辑
      }
    });
}
});</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h1>三、后端服务代码</h1>
<p>这边后端是用Java开发的,SpringBoot2.0小程序支付功能实现weixin-java-pay,主要是用到了第三方封装好的微信支付SDK</p>
<blockquote>
<p>WxJava - 微信开发 Java SDK(开发工具包); 支持包括微信支付、开放平台、公众号、企业微信/企业号、小程序等微信功能的后端开发。</p>
</blockquote>
<h2 id="hsdk">3.1 SDK使用方式</h2>
<p>Maven方式引入:</p>
<pre class="highlighter-hljs"><code class="xml language-xml hljs highlighter-hljs"><span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
&nbsp;&nbsp;<span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;com.github.binarywang<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
&nbsp;&nbsp;<span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;(不同模块参考下文)<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
&nbsp;&nbsp;<span class="hljs-tag">&lt;<span class="hljs-name">version&gt;3.3.0<span class="hljs-tag">&lt;/<span class="hljs-name">version&gt;
<span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>各模块的<strong>artifactId:</strong></p>
<ul>
<li>微信小程序:<code>weixin-java-miniapp</code></li>
<li>微信支付:<code>weixin-java-pay</code></li>
<li>微信开放平台:<code>weixin-java-open</code></li>
<li>公众号(包括订阅号和服务号):<code>weixin-java-mp</code></li>
<li>企业号/企业微信:<code>weixin-java-cp</code></li>
</ul>
<h2 id="h">3.2 配置微信相关信息</h2>
<p>application.yml</p>
<pre class="highlighter-hljs"><code class="yaml language-yaml highlighter-hljs hljs"><span class="hljs-comment">#微信小程序配置
<span class="hljs-attr">wx:
&nbsp;&nbsp;<span class="hljs-attr">miniapp:
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-attr">configs:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-string">-&nbsp;<span class="hljs-string">appid:&nbsp;<span class="hljs-comment">#微信公众号或者小程序等的appid&nbsp;必填
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-string">secret:&nbsp;<span class="hljs-comment">#微信公众号或者小程序等的secret&nbsp;必填
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-string">token:&nbsp;<span class="hljs-comment">#微信小程序消息服务器配置的token
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-string">aesKey:&nbsp;<span class="hljs-comment">#微信小程序消息服务器配置的EncodingAESKey
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-string">msgDataFormat:&nbsp;<span class="hljs-string">JSON
&nbsp;&nbsp;<span class="hljs-attr">pay:
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-string">appId:&nbsp;&nbsp;<span class="hljs-comment">#微信公众号或者小程序等的appid&nbsp;必填
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-string">mchId:&nbsp;&nbsp;<span class="hljs-comment">#微信支付商户号&nbsp;&nbsp;&nbsp;&nbsp;必填
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-string">mchKey:&nbsp;<span class="hljs-comment">#微信支付商户密钥
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-string">subAppId:&nbsp;<span class="hljs-comment">#服务商模式下的子商户公众账号ID
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-string">subMchId:&nbsp;<span class="hljs-comment">#服务商模式下的子商户号
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-string">keyPath:&nbsp;<span class="hljs-string">classpath:cert/apiclient_cert.p12&nbsp;<span class="hljs-comment">#&nbsp;p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
&nbsp;&nbsp;<span class="hljs-string">notifyUrl:&nbsp;<span class="hljs-string">https://www.xxx.com/wx/notify&nbsp;<span class="hljs-comment">#微信支付回调地址&nbsp;自己定义但是必须放到外网微信可以访问的到
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h2 id="h-1">3.3 编写统一订单接口业务</h2>
<p>调用统一下单支付接口:<strong>wxService.createOrder(orderRequest)</strong></p>
<pre class="highlighter-hljs"><code class="java language-java hljs highlighter-hljs"><span class="hljs-comment">/**
<span class="hljs-doctag"><span class="hljs-doctag"><span class="hljs-doctag">&nbsp;*&nbsp;<span class="hljs-doctag">@Author&nbsp;夏威夷8080
&nbsp;*&nbsp;<span class="hljs-doctag">@DateTime&nbsp;2019年4月6日&nbsp;上午11:54:08
&nbsp;*&nbsp;<span class="hljs-doctag">@version&nbsp;V1.0
&nbsp;*/

<span class="hljs-keyword">
<span class="hljs-keyword">import&nbsp;java.math.BigDecimal;
<span class="hljs-keyword">import&nbsp;java.text.SimpleDateFormat;
<span class="hljs-keyword">import&nbsp;java.util.Date;
<span class="hljs-keyword">import&nbsp;java.util.HashMap;
<span class="hljs-keyword">import&nbsp;java.util.Map;

<span class="hljs-keyword">import&nbsp;javax.servlet.http.HttpServletRequest;
<span class="hljs-keyword">import&nbsp;javax.servlet.http.HttpServletResponse;
<span class="hljs-keyword">import&nbsp;javax.servlet.http.HttpSession;

<span class="hljs-keyword">import&nbsp;org.apache.commons.io.IOUtils;
<span class="hljs-keyword">import&nbsp;org.apache.commons.lang3.StringUtils;
<span class="hljs-keyword">import&nbsp;org.springframework.beans.factory.annotation.Autowired;
<span class="hljs-keyword">import&nbsp;org.springframework.beans.factory.annotation.Value;
<span class="hljs-keyword">import&nbsp;org.springframework.web.bind.annotation.PostMapping;
<span class="hljs-keyword">import&nbsp;org.springframework.web.bind.annotation.RequestBody;
<span class="hljs-keyword">import&nbsp;org.springframework.web.bind.annotation.RequestMapping;
<span class="hljs-keyword">import&nbsp;org.springframework.web.bind.annotation.ResponseBody;
<span class="hljs-keyword">import&nbsp;org.springframework.web.bind.annotation.RestController;

<span class="hljs-keyword">import&nbsp;com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
<span class="hljs-keyword">import&nbsp;com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
<span class="hljs-keyword">import&nbsp;com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
<span class="hljs-keyword">import&nbsp;com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
<span class="hljs-keyword">import&nbsp;com.github.binarywang.wxpay.bean.result.BaseWxPayResult;
<span class="hljs-keyword">import&nbsp;com.github.binarywang.wxpay.constant.WxPayConstants;
<span class="hljs-keyword">import&nbsp;com.github.binarywang.wxpay.exception.WxPayException;
<span class="hljs-keyword">import&nbsp;com.github.binarywang.wxpay.service.WxPayService;

<span class="hljs-keyword">import&nbsp;io.renren.common.utils.DateUtils;
<span class="hljs-keyword">import&nbsp;io.renren.common.utils.IPUtils;
<span class="hljs-keyword">import&nbsp;io.renren.common.utils.PageUtils;
<span class="hljs-keyword">import&nbsp;io.renren.common.utils.R;
<span class="hljs-keyword">import&nbsp;io.renren.modules.soft.entity.AuthorizationEntity;
<span class="hljs-keyword">import&nbsp;io.renren.modules.soft.entity.HospitalEntity;
<span class="hljs-keyword">import&nbsp;io.renren.modules.soft.entity.OrderEntity;
<span class="hljs-keyword">import&nbsp;io.renren.modules.soft.entity.PayFlowEntity;
<span class="hljs-keyword">import&nbsp;io.renren.modules.soft.entity.PurchaseRecordEntity;
<span class="hljs-keyword">import&nbsp;io.renren.modules.soft.entity.RefundRecordEntity;
<span class="hljs-keyword">import&nbsp;io.renren.modules.soft.service.AuthorizationService;
<span class="hljs-keyword">import&nbsp;io.renren.modules.soft.service.BedBaseService;
<span class="hljs-keyword">import&nbsp;io.renren.modules.soft.service.DeviceService;
<span class="hljs-keyword">import&nbsp;io.renren.modules.soft.service.HospitalService;
<span class="hljs-keyword">import&nbsp;io.renren.modules.soft.service.OrderService;
<span class="hljs-keyword">import&nbsp;io.renren.modules.soft.service.PayFlowService;
<span class="hljs-keyword">import&nbsp;io.renren.modules.soft.service.PurchaseRecordService;
<span class="hljs-keyword">import&nbsp;io.renren.modules.soft.service.RefundRecordService;
<span class="hljs-keyword">import&nbsp;io.renren.modules.soft.service.StatementService;
<span class="hljs-keyword">import&nbsp;io.renren.modules.soft.service.ThirdUserService;
<span class="hljs-keyword">import&nbsp;io.renren.modules.soft.service.UserAuthorizationService;
<span class="hljs-keyword">import&nbsp;io.renren.modules.soft.service.UserService;
<span class="hljs-keyword">import&nbsp;io.swagger.annotations.Api;
<span class="hljs-keyword">import&nbsp;io.swagger.annotations.ApiImplicitParam;
<span class="hljs-keyword">import&nbsp;io.swagger.annotations.ApiImplicitParams;
<span class="hljs-keyword">import&nbsp;io.swagger.annotations.ApiOperation;
<span class="hljs-keyword">import&nbsp;lombok.extern.slf4j.Slf4j;

<span class="hljs-comment">/**
&nbsp;*&nbsp;<span class="hljs-doctag">@ClassName:&nbsp;WxUserVedioController
&nbsp;*&nbsp;<span class="hljs-doctag">@Description:&nbsp;
&nbsp;*&nbsp;<span class="hljs-doctag">@Author&nbsp;夏威夷8080
&nbsp;*&nbsp;<span class="hljs-doctag">@DateTime&nbsp;2019年4月6日&nbsp;上午11:54:08&nbsp;
&nbsp;*/
<span class="hljs-meta">@Api(tags&nbsp;=&nbsp;"普通用户操作接口")
<span class="hljs-meta">@RestController
<span class="hljs-meta">@RequestMapping("/wx")
<span class="hljs-meta">@Slf4j
<span class="hljs-keyword">public&nbsp;<span class="hljs-keyword">class&nbsp;<span class="hljs-title class_">WxxxxUserVedioController&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-meta">@Value("${wx.notifyUrl}")
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">private&nbsp;String&nbsp;notifyUrl;
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-meta">@Autowired
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">private&nbsp;WxPayService&nbsp;wxService;
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-meta">@Autowired
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">private&nbsp;HospitalService&nbsp;hospitalService;
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-meta">@Autowired
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">private&nbsp;PayFlowService&nbsp;payFlowService;
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-meta">@Autowired
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">private&nbsp;OrderService&nbsp;orderService;

&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<span class="hljs-doctag">@Title:&nbsp;createOrder
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<span class="hljs-doctag">@Description:&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<span class="hljs-doctag">@Author&nbsp;夏威夷8080
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<span class="hljs-doctag">@DateTime&nbsp;2019年4月6日&nbsp;下午12:12:11
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<span class="hljs-doctag">@param
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<span class="hljs-doctag">@return
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-meta">@PostMapping("/user/createOrder")
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">public&nbsp;R&nbsp;<span class="hljs-title function_">createOrder<span class="hljs-params">(HttpServletRequest&nbsp;request,<span class="hljs-meta">@RequestBody&nbsp;Map&lt;String,String&gt;&nbsp;map)&nbsp;&nbsp;<span class="hljs-keyword">throws&nbsp;WxPayException{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-type">String&nbsp;<span class="hljs-variable">bed_id&nbsp;<span class="hljs-operator">=&nbsp;map.get(<span class="hljs-string">"bedId");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(<span class="hljs-string">"参数的bed_id:{}",&nbsp;bed_id);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">if&nbsp;(StringUtils.isAnyBlank(bed_id))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">return&nbsp;R.error(<span class="hljs-string">"参数不能为null");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-type">Long&nbsp;<span class="hljs-variable">bedId&nbsp;<span class="hljs-operator">=&nbsp;Long.valueOf(bed_id).longValue();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">//根据bedId&nbsp;查找所属医院的价格
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-type">HospitalEntity&nbsp;<span class="hljs-variable">hospitalEntity&nbsp;<span class="hljs-operator">=&nbsp;hospitalService.hospitalByBedId(bed_id.trim());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-type">BigDecimal&nbsp;<span class="hljs-variable">money&nbsp;<span class="hljs-operator">=&nbsp;hospitalEntity.getCharge();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-type">HttpSession&nbsp;<span class="hljs-variable">session&nbsp;<span class="hljs-operator">=&nbsp;request.getSession();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-type">String&nbsp;<span class="hljs-variable">mobile&nbsp;<span class="hljs-operator">=&nbsp;(String)&nbsp;session.getAttribute(<span class="hljs-string">"userphone");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-type">String&nbsp;<span class="hljs-variable">userId&nbsp;<span class="hljs-operator">=&nbsp;(String)&nbsp;session.getAttribute(<span class="hljs-string">"userId");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">//&nbsp;TODO&nbsp;插入订单记录
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">//&nbsp;TODO&nbsp;记录用户的购买记录
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">//&nbsp;TODO&nbsp;调用统一生成订单接口
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-type">WxPayUnifiedOrderRequest&nbsp;<span class="hljs-variable">orderRequest&nbsp;<span class="hljs-operator">=&nbsp;<span class="hljs-keyword">new&nbsp;<span class="hljs-title class_">WxPayUnifiedOrderRequest();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;orderRequest.setSignType(WxPayConstants.SignType.MD5);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;orderRequest.setBody(<span class="hljs-string">"短信主体");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;orderRequest.setOutTradeNo(order_No);&nbsp;<span class="hljs-comment">//自己生成order_No
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;orderRequest.setTradeType(WxPayConstants.TradeType.JSAPI);
<span class="hljs-comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;orderRequest.setTotalFee(BaseWxPayRequest.yuanToFen(yuanMoney));//直接分
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;orderRequest.setTotalFee(money.intValue());<span class="hljs-comment">//直接分
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;orderRequest.setOpenid(userEntity.getOpenid());&nbsp;<span class="hljs-comment">//&nbsp;获取微信支付用户的openId
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;orderRequest.setSpbillCreateIp(IPUtils.getIpAddr(request));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-type">Date&nbsp;<span class="hljs-variable">now&nbsp;<span class="hljs-operator">=&nbsp;<span class="hljs-keyword">new&nbsp;<span class="hljs-title class_">Date();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-type">Date&nbsp;<span class="hljs-variable">afterDate&nbsp;<span class="hljs-operator">=&nbsp;DateUtils.addDateMinutes(now,&nbsp;<span class="hljs-number">10);<span class="hljs-comment">//10分钟后
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;orderRequest.setTimeStart(DateUtils.format(now,&nbsp;<span class="hljs-string">"yyyyMMddHHmmss"));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;orderRequest.setTimeExpire(DateUtils.format(afterDate,&nbsp;<span class="hljs-string">"yyyyMMddHHmmss"));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;orderRequest.setNotifyUrl(notifyUrl);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-type">Object&nbsp;<span class="hljs-variable">order&nbsp;<span class="hljs-operator">=&nbsp;wxService.createOrder(orderRequest);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">return&nbsp;R.ok().put(<span class="hljs-string">"order",&nbsp;order);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-meta">@ApiOperation("微信支付回调地址")
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-meta">@ResponseBody
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-meta">@PostMapping("/notify")
&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">public&nbsp;String&nbsp;<span class="hljs-title function_">payNotify<span class="hljs-params">(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">try&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">/*HttpSession&nbsp;session&nbsp;=&nbsp;request.getSession();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;mobile&nbsp;=&nbsp;(String)&nbsp;session.getAttribute("userphone");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(StringUtils.isBlank(mobile))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;R.error(401,&nbsp;"session获取不到授权手机号!");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获取用户手机号,根据用户手机号获取用户ID
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AuthorizationEntity&nbsp;user&nbsp;=&nbsp;authorizationService.getOneByMobile(mobile);*/
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-type">String&nbsp;<span class="hljs-variable">xmlResult&nbsp;<span class="hljs-operator">=&nbsp;IOUtils.toString(request.getInputStream(),&nbsp;request.getCharacterEncoding());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-type">WxPayOrderNotifyResult&nbsp;<span class="hljs-variable">notifyResult&nbsp;<span class="hljs-operator">=&nbsp;wxService.parseOrderNotifyResult(xmlResult);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">//&nbsp;结果正确&nbsp;outTradeNo
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-type">String&nbsp;<span class="hljs-variable">orderId&nbsp;<span class="hljs-operator">=&nbsp;notifyResult.getOutTradeNo();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-type">String&nbsp;<span class="hljs-variable">tradeNo&nbsp;<span class="hljs-operator">=&nbsp;notifyResult.getTransactionId();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-type">String&nbsp;<span class="hljs-variable">totalFee&nbsp;<span class="hljs-operator">=&nbsp;BaseWxPayResult.fenToYuan(notifyResult.getTotalFee());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">if(<span class="hljs-string">"SUCCESS".equals(notifyResult.getResultCode()))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-type">PayFlowEntity&nbsp;<span class="hljs-variable">entity&nbsp;<span class="hljs-operator">=&nbsp;<span class="hljs-keyword">new&nbsp;<span class="hljs-title class_">PayFlowEntity();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entity.setPayFee(BigDecimal.valueOf(notifyResult.getCashFee()));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entity.setPayFlowNo(orderId);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entity.setPayUserInfo(notifyResult.getOpenid());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entity.setThreeInNo(tradeNo);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;payFlowService.save(entity);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-type">OrderEntity&nbsp;<span class="hljs-variable">order_entity&nbsp;<span class="hljs-operator">=&nbsp;<span class="hljs-keyword">new&nbsp;<span class="hljs-title class_">OrderEntity();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-type">SimpleDateFormat&nbsp;<span class="hljs-variable">sdf&nbsp;<span class="hljs-operator">=&nbsp;<span class="hljs-keyword">new&nbsp;<span class="hljs-title class_">SimpleDateFormat(<span class="hljs-string">"yyyyMMddHHmmss");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;order_entity.setCreateTime(<span class="hljs-keyword">new&nbsp;<span class="hljs-title class_">Date());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">//更新订单信息
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UpdateWrapper&lt;OrderEntity&gt;&nbsp;updateWrapper&nbsp;=&nbsp;<span class="hljs-keyword">new&nbsp;<span class="hljs-title class_">UpdateWrapper&lt;&gt;();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateWrapper.set(<span class="hljs-string">"order_status",&nbsp;<span class="hljs-string">"1");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateWrapper.set(<span class="hljs-string">"pay_id",&nbsp;notifyResult.getOpenid());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateWrapper.set(<span class="hljs-string">"pay_status",&nbsp;<span class="hljs-string">"1");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateWrapper.set(<span class="hljs-string">"pay_end_time",&nbsp;sdf.parse(notifyResult.getTimeEnd()));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateWrapper.eq(<span class="hljs-string">"order_no",notifyResult.getOutTradeNo());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;orderService.update(updateWrapper);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">//自己处理订单的业务逻辑,需要判断订单是否已经支付过,否则可能会重复调用
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">return&nbsp;WxPayNotifyResponse.success(<span class="hljs-string">"成功");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="hljs-keyword">catch&nbsp;(Exception&nbsp;e)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(<span class="hljs-string">"微信回调结果异常,异常原因{}",&nbsp;e.getMessage());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">//&nbsp;WxPayNotifyResponse.fail(e.getMessage());

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">return&nbsp;WxPayNotifyResponse.success(<span class="hljs-string">"code:"+<span class="hljs-number">9999+<span class="hljs-string">"微信回调结果异常,异常原因:"+e.getMessage());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h1>&nbsp;四、总结</h1>
<div>梳理下简单流程</div>
<div>后端生成预订单返回给前端&nbsp;-&gt; 前端拿到订单信息调用&nbsp;wx.requestPayment API进行支付&nbsp;&nbsp;-&gt;&nbsp; 支付成功,跳转到回调地址&nbsp;&nbsp;-&gt;&nbsp; 在回调url里处理支付成功后的业务逻辑</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/shamo89/p/17421896.html
頁: [1]
查看完整版本: 微信小程序集成微信支付开发,后端是springboot项目