1.支付宝微信支付
<!--引入阿里支付-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.38.60.ALL</version>
</dependency>
AliPayment.java
package com.ruoyi.coupon.payment;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException;
import com.alipay.api.CertAlipayRequest;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.domain.AlipayTradeRefundModel;
import com.alipay.api.domain.ExtendParams;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.*;
import com.alipay.api.response.*;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.exception.GlobalException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.coupon.payment.dto.PayParam;
import com.ruoyi.coupon.payment.dto.RefundParam;
import com.ruoyi.coupon.service.ICouponConfigService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 阿里支付类
*/
@Service
@Slf4j
public class AliPayment {
private static Map<String,DefaultAlipayClient> aliCertClientMap = new HashMap();
/*public static String appid="";
//应用私钥 参考 https://opendocs.alipay.com/support/01rauw
public static String privateKey="";
//服务商的账户pid 参考 https://opendocs.alipay.com/open/194/105190?pathHash=e479c7e4#%E8%BF%94%E4%BD%A3
public static String sysServiceProviderId="";*/
public static String appid="";
//应用私钥 参考 https://opendocs.alipay.com/support/01rauw
public static String privateKey="";
//服务商的账户pid 参考 https://opendocs.alipay.com/open/194/105190?pathHash=e479c7e4#%E8%BF%94%E4%BD%A3
public static String sysServiceProviderId="";
@Autowired
private RedisCache redisCache;
@Autowired
private ICouponConfigService couponConfigService;
/**
* 获取客户端
* @return
*/
public DefaultAlipayClient getAliCertClient() {
DefaultAlipayClient aliCertClient = aliCertClientMap.get("aliCertClient");
if(aliCertClient != null){
return aliCertClient;
}
File appCert = new File("aliPayCert/appCertPublicKey_2021004*******.crt");
File alipayCert = new File("aliPayCert/alipayCertPublicKey_RSA2.crt");
File alipayRootCert = new File("aliPayCert/alipayRootCert.crt");
try {
if (!appCert.exists()) {
InputStream stream = AliPayment.class.getResourceAsStream("/aliPayCert/appCertPublicKey_2021004*******.crt");
FileUtils.copyInputStreamToFile(stream, appCert);
}
if (!alipayCert.exists()) {
InputStream stream = AliPayment.class.getResourceAsStream("/aliPayCert/alipayCertPublicKey_RSA2.crt");
FileUtils.copyInputStreamToFile(stream, alipayCert);
}
if (!alipayRootCert.exists()) {
InputStream stream = AliPayment.class.getResourceAsStream("/aliPayCert/alipayRootCert.crt");
FileUtils.copyInputStreamToFile(stream, alipayRootCert);
}
} catch (IOException e) {
log.error(e.getMessage());
throw new GlobalException(e.getMessage());
}
String appCertPath = appCert.getAbsolutePath();
String alipayCertPath = alipayCert.getAbsolutePath();
String alipayRootCertPath = alipayRootCert.getAbsolutePath();
String privateKey=this.privateKey;
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
certAlipayRequest.setAppId(this.appid);
certAlipayRequest.setPrivateKey(privateKey);
certAlipayRequest.setFormat("JSON");
certAlipayRequest.setCharset("utf-8");
certAlipayRequest.setSignType("RSA2");
certAlipayRequest.setCertPath(appCertPath);
certAlipayRequest.setAlipayPublicCertPath(alipayCertPath);
certAlipayRequest.setRootCertPath(alipayRootCertPath);
DefaultAlipayClient alipayClient = null;
try {
alipayClient = new DefaultAlipayClient(certAlipayRequest);
aliCertClientMap.put("aliCertClient",alipayClient);
} catch (AlipayApiException e) {
e.printStackTrace();
}
return alipayClient;
}
/**
* 下单
* @param payParam
* @return
*/
public String pay(PayParam payParam) {
String apiUrl = couponConfigService.getValue("online_domain");
//证书公钥模式
DefaultAlipayClient alipayClient = this.getAliCertClient();
// 创建API对应的request(网页版)
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
request.setNotifyUrl(apiUrl + "/api/payment/alipay/notify");
//request.setNotifyUrl("http://egevdr.natappfree.cc" + "/payment/alipay/notify");
request.setReturnUrl("");
/******必传参数******/
JSONObject bizContent = new JSONObject();
//商户订单号,商家自定义,保持唯一性
bizContent.put("out_trade_no", payParam.getOutTradeNo());
//支付金额,最小值0.01元
bizContent.put("total_amount",payParam.getTotalAmount());
//订单标题,不可使用特殊符号
bizContent.put("subject", payParam.getSubject());
/******可选参数******/
//手机网站支付默认传值FAST_INSTANT_TRADE_PAY
bizContent.put("product_code", "QUICK_WAP_WAY");
//bizContent.put("time_expire", "2022-08-01 22:00:00");
request.setBizContent(bizContent.toString());
try {
AlipayTradeWapPayResponse alipayTradeWapPayResponse = alipayClient.pageExecute(request);
String body = alipayTradeWapPayResponse.getBody();
return body;
} catch (AlipayApiException e) {
e.printStackTrace();
}
return null;
}
/**
* 退款
* @param pefundParam
* @return
*/
public Boolean refundOrder(RefundParam pefundParam) {
DefaultAlipayClient alipayClient = this.getAliCertClient();
String apiUrl = couponConfigService.getValue("online_domain");;
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", pefundParam.getOutTradeNo());
bizContent.put("refund_amount", pefundParam.getRefund());
bizContent.put("refund_reason",pefundParam.getBody());
request.setBizContent(bizContent.toString());
//request.setNotifyUrl(apiUrl + "/api/payment/alipay/notify");
try {
AlipayTradeRefundResponse response = alipayClient.certificateExecute(request);
return response.isSuccess();
} catch (AlipayApiException e) {
e.printStackTrace();
}
return null;
}
/**
* 查询订单接口 https://opendocs.alipay.com/open/02ivbt?scene=common&pathHash=8abc6ffe
* @param orderNum
* @return
*/
public Map orderQuery(String orderNum) {
DefaultAlipayClient alipayClient = this.getAliCertClient();
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", orderNum);
//bizContent.put("trade_no", "2014112611001004680073956707");
request.setBizContent(bizContent.toString());
try {
AlipayTradeQueryResponse alipayTradeQueryResponse = alipayClient.certificateExecute(request);
Map map=new HashMap();
map.put("tradeState",alipayTradeQueryResponse.getTradeStatus());
/**
* 交易状态:WAIT_BUYER_PAY(交易创建,等待买家付款)、TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)、TRADE_SUCCESS(交易支付成功)、TRADE_FINISHED(交易结束,不可退款)
*/
return map;
} catch (AlipayApiException e) {
e.printStackTrace();
}
return null;
}
/**
* 公钥证书模式效验签名
* @param request
* @return
*/
public boolean ZSRsaCheck(HttpServletRequest request){
/**
* 支付宝线上的验签需要的支付宝公钥证书
*/
File alipayCert = new File("aliPayCert/alipayCertPublicKey_RSA2.crt");
try {
if (!alipayCert.exists()) {
InputStream stream = AliPayment.class.getResourceAsStream("/aliPayCert/alipayCertPublicKey_RSA2.crt");
FileUtils.copyInputStreamToFile(stream, alipayCert);
}
} catch (IOException e) {
log.error("alipayCertPublicKey 证书文件未找到:{}",e.getMessage());
throw new GlobalException(e.getMessage());
}
//支付宝公钥证书
String alipayPublicCertPath=alipayCert.getAbsolutePath();
/**
* 这种方式效率高一点
*/
//签名方式
String sign_type="RSA2";
//对待签名字符串数据通过&进行拆分
Map requestParams = request.getParameterMap();
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
//把拆分数据放在map集合内
for (Object o : requestParams.keySet()) {
String name = (String) o;
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
map.put(name, valueStr);
}
try {
return AlipaySignature.rsaCertCheckV1(map, alipayPublicCertPath, "utf-8",sign_type);
} catch (AlipayApiException e) {
log.error("支付宝异步验签失败:{}",e.getMessage());
return false;
}
}
/**
* 支付宝转账
* @param param
* @return
*/
public Map alipayTransfer(Map param){
//获得公钥证书模式支付宝客户端
DefaultAlipayClient aliCertClient = getAliCertClient();
AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
request.setBizContent("{" +
"\"out_biz_no\":\""+param.get("outBizNo")+"\"," +
"\"trans_amount\":"+param.get("transAmount")+"," +
"\"product_code\":\"TRANS_ACCOUNT_NO_PWD\"," +
"\"biz_scene\":\"DIRECT_TRANSFER\"," +
"\"order_title\":\""+param.get("orderTitle")+"\"," +
"\"payee_info\":{" +
"\"identity_type\":\"ALIPAY_LOGON_ID\"," +
"\"identity\":\""+param.get("identity")+"\"," +
"\"name\":\""+param.get("name")+"\"" +
"}," +
"\"remark\":\""+param.get("remark")+"\"," +
"\"business_params\":{\"payer_show_name_use_alias\":\"true\"}" +
"}");
//返回的map
Map rmap=new HashMap();
try {
AlipayFundTransUniTransferResponse response = aliCertClient.certificateExecute(request);
rmap.put("isSuccess",response.isSuccess());
rmap.put("subMsg",response.getSubMsg());
return rmap;
} catch (AlipayApiException e) {
e.printStackTrace();
return rmap;
}
}
}
AlipayNotify.java
package com.ruoyi.api.controller.coupon.payment.rest;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.coupon.payment.AliPayment;
import com.ruoyi.coupon.payment.enums.AliPayStatusEnum;
import com.ruoyi.coupon.payment.event.PaymentEvent;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@RestController
@RequestMapping("/payment/alipay")
public class AlipayNotify {
@Autowired
private AliPayment aliPayment;
@Autowired
private ApplicationEventPublisher publisher;
@RequestMapping(value = "/notify", method = {RequestMethod.GET, RequestMethod.POST})
@SuppressWarnings("all")
public ResponseEntity<Object> notify(HttpServletRequest request) throws UnsupportedEncodingException {
Map<String, String[]> parameterMap = request.getParameterMap();
//内容验签,防止黑客篡改参数
//if (alipayUtils.rsaCheck(request,alipay)) {
if(aliPayment.ZSRsaCheck(request)){
//交易状态
String tradeStatus = getRequestParameter(request, "trade_status");
// 商户订单号
String outTradeNo = getRequestParameter(request, "out_trade_no");
//支付宝交易号
String tradeNo = getRequestParameter(request, "trade_no");
//付款金额
String totalAmount = getRequestParameter(request, "total_amount");
//退款金额
String refundFee = getRequestParameter(request, "refund_fee");
//获取回传参数paymentType
String passbackParams = getRequestParameter(request, "passback_params");
Map<String,String> map=new HashMap<>();
if(StringUtils.isNotBlank(passbackParams)){
passbackParams= java.net.URLDecoder.decode(passbackParams,"UTF-8");
String[] split = StringUtils.split(passbackParams, ";");
for (int i=0;i<split.length;i++){
String[] split1 = StringUtils.split(split[i], "=");
map.put(split1[0],split1[1]);
}
}
//记录日志
if (StringUtils.isNotEmpty(refundFee)) {
log.info(">>>>> 交易状态: {}, 商户订单号: {}, 支付宝交易号: {}, 退款金额: {}", tradeStatus, outTradeNo, tradeNo, refundFee);
//验证
if (AliPayStatusEnum.CLOSED.getValue().equals(tradeStatus)) {
// outTradeNo 退款成功
publisher.publishEvent(new PaymentEvent(this, outTradeNo,1,map,refundFee));
}
} else if (StringUtils.isNotEmpty(totalAmount)) {
log.info(">>>>> 交易状态: {}, 商户订单号: {}, 支付宝交易号: {}, 付款金额: {}", tradeStatus, outTradeNo, tradeNo, totalAmount);
//验证
if (AliPayStatusEnum.SUCCESS.getValue().equals(tradeStatus) || AliPayStatusEnum.FINISHED.getValue().equals(tradeStatus)) {
// outTradeNo 支付成功
publisher.publishEvent(new PaymentEvent(this, outTradeNo,0,map,totalAmount));
}
} else {
log.info(">>>>> 交易状态: {}, 商户订单号: {}, 支付宝交易号: {}", tradeStatus, outTradeNo, tradeNo);
}
return new ResponseEntity<>("success",HttpStatus.OK);//返回success ,让支付宝不在重复调起回调
}
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
private String getRequestParameter(HttpServletRequest request, String valname) {
String value = request.getParameter(valname);
if (value != null) {
return new String(value.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
}
return value;
}
}
2.微信支付
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-java</artifactId>
<version>0.2.11</version>
</dependency>
WeChatPayment.java
package com.ruoyi.coupon.payment;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.ruoyi.common.exception.GlobalException;
import com.ruoyi.coupon.payment.dto.PayParam;
import com.ruoyi.coupon.payment.dto.RefundParam;
import com.ruoyi.coupon.payment.utils.IpUtil;
import com.ruoyi.coupon.service.ICouponConfigService;
import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.core.notification.NotificationConfig;
import com.wechat.pay.java.core.notification.NotificationParser;
import com.wechat.pay.java.core.notification.RequestParam;
import com.wechat.pay.java.service.payments.h5.H5Service;
import com.wechat.pay.java.service.payments.h5.model.*;
import com.wechat.pay.java.service.payments.model.Transaction;
import com.wechat.pay.java.service.payments.model.TransactionAmount;
import com.wechat.pay.java.service.refund.RefundService;
import com.wechat.pay.java.service.refund.model.AmountReq;
import com.wechat.pay.java.service.refund.model.CreateRequest;
import com.wechat.pay.java.service.refund.model.Refund;
import com.wechat.pay.java.service.refund.model.RefundNotification;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* 微信支付服务类
*/
@Service
@Slf4j
public class WeChatPayment {
private static final String mchId = ""; // 商户号
private static final String mchSerialNo = ""; // 商户证书序列号
//商户私钥 //https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay3_1.shtml
private static final String privateKey = "";
// 你的微信支付平台证书
private static final String apiV3Key = "";
private static final String appid="";
/** 商户API私钥路径 */
public static String privateKeyPath = "C:\\Users\\Administrator\\Desktop\\coupon\\wxpay\\apiclient_key.pem";
@Autowired
private ICouponConfigService couponConfigService;
/**
* 获得H5客户端
* @return
*/
public H5Service getH5Service () {
Config config =
new RSAAutoCertificateConfig.Builder()
.merchantId(mchId)
.privateKey(privateKey)
//.privateKeyFromPath(privateKeyPath)
.merchantSerialNumber(mchSerialNo)
.apiV3Key(apiV3Key)
.build();
H5Service build = new H5Service.Builder().config(config).build();
return build;
}
public String pay(PayParam payParam) {
String apiUrl = couponConfigService.getValue("online_domain");
BigDecimal bigDecimal = new BigDecimal(100);
int payPrice = bigDecimal.multiply(new BigDecimal(payParam.getTotalAmount())).intValue();
H5Service h5Service = getH5Service();
//获取客户端
PrepayRequest request = new PrepayRequest();
Amount amount = new Amount();
amount.setTotal(payPrice);
H5Info h5Info = new H5Info();
h5Info.setType("Wap");
//场景信息
SceneInfo sceneInfo = new SceneInfo();
sceneInfo.setPayerClientIp("qy.gsjf.cc");
sceneInfo.setH5Info(h5Info);
request.setAmount(amount);
request.setAppid(appid);
request.setMchid(mchId);
request.setDescription(payParam.getSubject());
//request.setNotifyUrl("http://egevdr.natappfree.cc" + "/payment/weChatPay/payment/notify");
request.setNotifyUrl(apiUrl +"api" + "/payment/weChatPay/payment/notify");
request.setOutTradeNo(payParam.getOutTradeNo());
request.setAttach(payParam.getPassbackParams());//携带其他参数
request.setSceneInfo(sceneInfo);
// 调用下单方法,得到应答
PrepayResponse prepay = h5Service.prepay(request);
return prepay.getH5Url();
}
/**
* 申请退款
* @param refundParam
*/
public void refundOrder(RefundParam refundParam) {
String apiUrl = couponConfigService.getValue("online_domain");
BigDecimal bigDecimal = new BigDecimal(100);
int total = bigDecimal.multiply(new BigDecimal(refundParam.getTotal())).intValue();
int refund = bigDecimal.multiply(new BigDecimal(refundParam.getRefund())).intValue();
Config config =
new RSAAutoCertificateConfig.Builder()
.merchantId(mchId)
.privateKey(privateKey)
.merchantSerialNumber(mchSerialNo)
.apiV3Key(apiV3Key)
.build();
RefundService service = new RefundService.Builder().config(config).build();
//生成随机退款订单号
String s = UUID.randomUUID().toString().replace("-","");
CreateRequest request = new CreateRequest();
//金额信息
AmountReq amount = new AmountReq();
amount.setCurrency("CNY");
amount.setTotal(Long.valueOf(total));
amount.setRefund(Long.valueOf(refund));
request.setAmount(amount);
request.setOutTradeNo(refundParam.getOutTradeNo());
request.setOutRefundNo(s);
//request.setNotifyUrl("http://egevdr.natappfree.cc" + "/payment/weChatPay/refund/notify");
request.setNotifyUrl(apiUrl +"api" + "/payment/weChatPay/refund/notify");
//发送请求
Refund refund1 = service.create(request);
}
/**
* 根据订单号查询订单信息,目前只返回了订单状态 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_3_2.shtml
* @param orderNum
* @return
*/
public Map queryOrderByOutTradeNo(String orderNum) {
H5Service h5Service = getH5Service();
QueryOrderByOutTradeNoRequest request = new QueryOrderByOutTradeNoRequest();
request.setMchid(mchId);
request.setOutTradeNo(orderNum);
Transaction transaction = h5Service.queryOrderByOutTradeNo(request);
Map map=new HashMap();
map.put("tradeState",transaction.getTradeState());
/**
* 交易状态,枚举值:
* SUCCESS:支付成功
* REFUND:转入退款
* NOTPAY:未支付
* CLOSED:已关闭
* REVOKED:已撤销(仅付款码支付会返回)
* USERPAYING:用户支付中(仅付款码支付会返回)
* PAYERROR:支付失败(仅付款码支付会返回)
*/
return map;
}
/**
* 支付成功验签
* @param request
* @return
*/
public Map paySuccessCheck(HttpServletRequest request) {
Config config =
new RSAAutoCertificateConfig.Builder()
.merchantId(mchId)
.privateKey(privateKey)
.merchantSerialNumber(mchSerialNo)
.apiV3Key(apiV3Key)
.build();
// 从请求头中获取信息
String timestamp = request.getHeader("Wechatpay-Timestamp");
String nonce = request.getHeader("Wechatpay-Nonce");
String signature = request.getHeader("Wechatpay-Signature");
String singType = request.getHeader("Wechatpay-Signature-Type");
String wechatPayCertificateSerialNumber = request.getHeader("Wechatpay-Serial");
String requestBody = getRequestBody(request);
// 构造 RequestParam
RequestParam requestParam = new RequestParam.Builder()
.serialNumber(wechatPayCertificateSerialNumber)
.nonce(nonce)
.signature(signature)
.signType(singType)
.timestamp(timestamp)
.body(requestBody)
.build();
// 初始化解析器 NotificationParser
NotificationParser parser = new NotificationParser((NotificationConfig) config);
// 这个Transaction是微信包里面的
Transaction decryptObject = parser.parse(requestParam, Transaction.class);
TransactionAmount amount = decryptObject.getAmount();
String outTradeNo = decryptObject.getOutTradeNo();
String attach = decryptObject.getAttach();
Map map=new HashMap();
map.put("amount",amount.getTotal());
map.put("outTradeNo",outTradeNo);
map.put("attach",attach);
return map;
}
public Map refundSuccessCheck(HttpServletRequest request) {
Config config =
new RSAAutoCertificateConfig.Builder()
.merchantId(mchId)
.privateKey(privateKey)
.merchantSerialNumber(mchSerialNo)
.apiV3Key(apiV3Key)
.build();
// 从请求头中获取信息
String timestamp = request.getHeader("Wechatpay-Timestamp");
String nonce = request.getHeader("Wechatpay-Nonce");
String signature = request.getHeader("Wechatpay-Signature");
String singType = request.getHeader("Wechatpay-Signature-Type");
String wechatPayCertificateSerialNumber = request.getHeader("Wechatpay-Serial");
String requestBody = getRequestBody(request);
// 构造 RequestParam
RequestParam requestParam = new RequestParam.Builder()
.serialNumber(wechatPayCertificateSerialNumber)
.nonce(nonce)
.signature(signature)
.signType(singType)
.timestamp(timestamp)
.body(requestBody)
.build();
// 初始化解析器 NotificationParser
NotificationParser parser = new NotificationParser((NotificationConfig) config);
// 这个Transaction是微信包里面的
RefundNotification decryptObject = parser.parse(requestParam, RefundNotification.class);
com.wechat.pay.java.service.refund.model.Amount amount = decryptObject.getAmount();
String outTradeNo = decryptObject.getOutTradeNo();
Map map=new HashMap();
map.put("amount",amount.getTotal());
map.put("outTradeNo",outTradeNo);
return map;
}
// 获取请求头里的数据
private String getRequestBody(HttpServletRequest request) {
StringBuffer sb = new StringBuffer();
try (
ServletInputStream inputStream = request.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
) {
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
System.out.println("读取数据流异常:"+e);
}
return sb.toString();
}
}
WeChatPayNotify.java
package com.ruoyi.api.controller.coupon.payment.rest;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.coupon.payment.WeChatPayment;
import com.ruoyi.coupon.payment.event.PaymentEvent;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
/**
* 商城支付项微信支付的回调接口
*/
@Slf4j
@RestController
@RequestMapping("/payment/weChatPay")
public class WeChatPayNotify {
@Autowired
private ApplicationEventPublisher publisher;
@Autowired
private WeChatPayment weChatPayment;
/**
* 微信支付/充值回调
*/
@PostMapping("/payment/notify")
public ResponseEntity.BodyBuilder renotify(HttpServletRequest request) {
Map map = weChatPayment.paySuccessCheck(request);
Integer amount = (Integer)map.get("amount");
String outTradeNo = (String)map.get("outTradeNo");
String attach = (String)map.get("attach");
Map<String, Object> map1 = new HashMap<>();
//将附加信息 attach 解析到 map1 中,因为现在没有传递任何参数,所以没有解析
BigDecimal divide = new BigDecimal(amount).divide(new BigDecimal("100"));
publisher.publishEvent(new PaymentEvent(this, outTradeNo,0,map1,divide.toString()));
return ResponseEntity.status(HttpStatus.OK);
}
/**
* 微信退款回调
*/
@PostMapping("/refund/notify")
public ResponseEntity.BodyBuilder parseRefundNotifyResult(HttpServletRequest request) {
Map map = weChatPayment.refundSuccessCheck(request);
Long amount = (Long)map.get("amount");
String outTradeNo = (String)map.get("outTradeNo");
BigDecimal divide = new BigDecimal(amount).divide(new BigDecimal("100"));
publisher.publishEvent(new PaymentEvent(this, outTradeNo,1,null,divide.toString()));
return ResponseEntity.status(HttpStatus.OK);
}
}
前端 uniapp 的调起方式
<view class="alipaysubmit" v-html="formContent"></view>
createOrder(data).then(res=>{
uni.hideLoading()
this.payType=''
if(res.data.payType=="aliPayH5"){
this.formContent=res.data.payStrand
this.$nextTick(() => {
document.forms['punchout_form'].submit();
})
}else if(res.data.payType=="weChatH5"){
const platform = uni.getSystemInfoSync().platform
let mweb_url = res.data.payStrand
var a=document.createElement('a');
switch (platform) {
case 'android':
a.href=mweb_url
a.click()
break;
case 'ios':
a.href=mweb_url
a.click()
break;
default:
break;
}
}else if(res.data.payType=="balance"){
uni.showToast({
title:res.data.payStrand
})
}
uni.navigateTo({
url:"/pages/mine/order/order"
})
})