一:java配置
微信支付(小程序)-java配置
二:工具類:獲取本地IP與Enum類 與訂單支付返回?cái)?shù)據(jù)
1: 獲取本地IP工具類
2:訂單 Enum類
package com.io.common.enums;
public enum OrderStatusEnum {
CANCEL(0,"已取消"),
NOT_YET_SHIPPED(1,"待支付"),
PART_OF_THE_SHIPMENT(2,"待發(fā)貨"),
WAIT_RECEIVING(3,"待收貨"),
ACHIEVE(4,"已完成"),
;
private Integer key;
private String desc;
OrderStatusEnum(Integer key, String desc){
this.key = key;
this.desc = desc;
}
public Integer getKey() {
return key;
}
public String getDesc() {
return desc;
}
}
3:支付方式Enum類
package com.io.common.enums;
public enum PayTypeEnum {
WX_PAY(1, "微信支付"),
;
private Integer key;
private String desc;
PayTypeEnum(Integer key, String desc) {
this.key = key;
this.desc = desc;
}
public Integer getKey() {
return key;
}
public String getDesc() {
return desc;
}
public static String getDesc(Integer key) {
for (PayTypeEnum c : PayTypeEnum.values()) {
if (c.key.equals(key)) {
return c.getDesc();
}
}
return null;
}
}
4:微信支付form提交數(shù)據(jù)
package com.io.order.form;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author ts
* @version 1.0
* @date 2022/08/05
*/
@Data
public class WxPayForm {
private Integer orderId;
@ApiModelProperty("訂單號(hào)")
private String orderNo;
@ApiModelProperty("支付訂單號(hào)")
private String orderPayNo;
@ApiModelProperty("實(shí)際支付金額")
private BigDecimal payAmount;
}
5:微信支付訂單返回?cái)?shù)據(jù)
package com.io.order.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class AfterPayVO {
@ApiModelProperty("timeStamp")
private String timeStamp;
@ApiModelProperty("nonceStr")
private String nonceStr;
@ApiModelProperty("packageValue")
private String packageValue;
@ApiModelProperty("signType")
private String signType;
@ApiModelProperty("paySign")
private String paySign;
}
三:service與controller
1:支付 service類
package com.io.order.service;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.io.order.form.WxPayForm;
import com.io.order.vo.AfterPayVO;
import javax.servlet.http.HttpServletResponse;
public interface PayService {
/**
* 微信支付
* @param form 訂單數(shù)據(jù)
* @param userId // 用戶id
* @param wxId // 微信用戶id
* @return
* @throws
*/
AfterPayVO pay(WxPayForm form, String userId,Integer wxId) throws WxPayException;
/**
* 微信支付回調(diào)
* @param appid
* @param xmlData
* @param response
* @throws Exception
*/
void payNotify(String appid, String xmlData, HttpServletResponse response) throws Exception;
}
2:支付 service類實(shí)現(xiàn)
package com.io.order.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import com.io.common.enums.OrderStatusEnum;
import com.io.common.enums.PayTypeEnum;
import com.io.entity.WxUserEntity;
import com.io.exception.RRException;
import com.io.order.config.WxPayProperties;
import com.io.order.dao.OrderDao;
import com.io.order.entity.OrderEntity;
import com.io.order.form.WxPayForm;
import com.io.order.service.PayService;
import com.io.order.vo.AfterPayVO;
import com.io.order.vo.RefundVO;
import com.io.service.WxUserService;
import com.io.util.ConvertUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.time.LocalDateTime;
import java.util.Objects;
@Service
@Slf4j
public class PayServiceImpl implements PayService {
@Autowired
private WxUserService wxUserService;
@Value("${he.wx.appid}")
private String wxAppid;
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public AfterPayVO pay(WxPayForm form, String userId, Integer wxId) throws WxPayException {
// 查詢根據(jù)微信id(存微信用戶表的id)查詢MySQL數(shù)據(jù)庫(kù)獲取當(dāng)前用戶的微信數(shù)據(jù)
WxUserEntity byId = wxUserService.getById(wxId);
if (Objects.isNull(byId)){
log.info("微信支付用戶wxId:" + wxId);
throw new RRException("無(wú)該微信用戶");
}
WxPayService wxPayService = this.getWxPayService(wxAppid);
WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
orderRequest.setBody("商品付款");
orderRequest.setOutTradeNo(form.getOrderPayNo());
orderRequest.setTotalFee(BaseWxPayRequest.yuanToFen(form.getPayAmount().toString()));//元轉(zhuǎn)成分
orderRequest.setOpenid(byId.getXwOpenId()); // 支付微信用戶 微信openId
orderRequest.setSpbillCreateIp(IpUtils.getAddrIp()); // 本地ip設(shè)置
orderRequest.setSpbillCreateIp("114.55.114.66");
orderRequest.setNotifyUrl(String.format(properties.getNotifyUrl(), "payNotify", byId.getXwOpenId())); // 支付回調(diào)路徑與參數(shù)拼接設(shè)置
// 支付方式
orderRequest.setTradeType("JSAPI");
orderRequest.setAppid(wxAppid);
Object result = wxPayService.createOrder(orderRequest);
AfterPayVO afterPayVO = ConvertUtils.sourceToTarget(result, AfterPayVO.class);
return afterPayVO;
}
@Override
public void payNotify(String appid, String xmlData, HttpServletResponse response) throws Exception {
WxPayService wxPayService = this.getWxPayService(appid);
final WxPayOrderNotifyResult notifyResult = wxPayService.parseOrderNotifyResult(xmlData);
log.info("支付訂單號(hào):" + notifyResult.getOutTradeNo());
// 小程序支付成功后回調(diào)這個(gè)接口 后的訂單業(yè)務(wù)邏輯 (請(qǐng)根據(jù)項(xiàng)目來(lái)編寫(xiě))
LambdaQueryWrapper<OrderEntity> lambdaQueryWrapper =new LambdaQueryWrapper<OrderEntity>();
lambdaQueryWrapper.eq(OrderEntity::getOrderPayNo,notifyResult.getOutTradeNo());
OrderEntity orderEntity = orderDao.selectOne(lambdaQueryWrapper);
//訂單狀態(tài)
if (OrderStatusEnum.NOT_YET_SHIPPED.getKey().equals(orderEntity.getOrderStatus())){
orderEntity.setOrderStatus(OrderStatusEnum.PART_OF_THE_SHIPMENT.getKey());
orderEntity.setPaymentType(PayTypeEnum.WX_PAY.getKey());
orderEntity.setPaymentTime(LocalDateTime.now());
orderDao.updateById(orderEntity);
}
//回復(fù)微信防止重復(fù)回調(diào)
StringBuilder resXml = new StringBuilder();
resXml.append("<xml>");
resXml.append("<return_code><![CDATA[SUCCESS]]></return_code>");
resXml.append("<return_msg><![CDATA[OK]]></return_msg>");
resXml.append("</xml>");
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
out.write(resXml.toString().getBytes());
out.flush();
out.close();
}
/** 獲取商戶號(hào)配置并生成 WxPayService
* getWxPayService
* @param appid
* @return
*/
private WxPayService getWxPayService(String appid){
WxPayConfig payConfig = new WxPayConfig();
payConfig.setAppId(appid);
payConfig.setMchId(StringUtils.trimToNull(this.properties.getMchId()));
payConfig.setMchKey(StringUtils.trimToNull(this.properties.getMchKey()));
payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getKeyPath()));
// 可以指定是否使用沙箱環(huán)境
payConfig.setUseSandboxEnv(false);
WxPayService wxPayService = new WxPayServiceImpl();
wxPayService.setConfig(payConfig);
return wxPayService;
}
}
3: Controller類
package com.io.order.controller;
import com.io.base.BaseController;
import com.io.order.service.PayService;
import com.io.util.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
@RestController
@RequestMapping("/pay")
@Api(tags = "支付接口")
@Slf4j
public class PayController{
@Autowired
private PayService payService;
@PostMapping("/payNotify/{appid}")
@ApiOperation("支付回調(diào)")
public R payNotify(@PathVariable String appid, @RequestBody String xmlData, HttpServletResponse response) throws Exception {
payService.payNotify(appid, xmlData, response);
return R.ok();
}
三:小程序調(diào)用 支付接口
官方文檔:wx.requestPayment
注:res.data.purchase 是先走下單邏輯(去后臺(tái)下單并且調(diào)用了 支付接口)
返回參數(shù): AfterPayVO類;
小程序前端所用到的參數(shù)是 訂單支付返回的參數(shù)
wx.requestPayment({
timeStamp: res.data.purchase.timeStamp,
nonceStr: res.data.purchase.nonceStr,
package: res.data.purchase.packageValue,
signType: 'MD5',
paySign: res.data.purchase.paySign,
success (res) {
支付成功
},
fail (res) {
支付取消或失敗
}
})
2: 開(kāi)發(fā)工具中測(cè)試支付接口 所展示的樣子
3:正式環(huán)境樣式文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-632910.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-632910.html
到了這里,關(guān)于微信支付(小程序)-java實(shí)現(xiàn)與小程序?qū)崿F(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!