package com.lmk.wxpay.service.impl;
import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayUtil;
import com.lmk.wxpay.bean.ResultMap;
import com.lmk.wxpay.config.WxPayAppConfig;
import com.lmk.wxpay.service.WxPayService;
import io.micrometer.core.instrument.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@Service
public class WxPayServiceImpl implements WxPayService {
private final Logger logger = LoggerFactory.getLogger(WxPayServiceImpl.class);
@Autowired
private WxPayAppConfig wxPayAppConfig;
@Override
public ResultMap unifiedOrder(String orderNo, double amount, String body) {
Map<String, String> returnMap = new HashMap<>();
Map<String, String> responseMap = new HashMap<>();
Map<String, String> requestMap = new HashMap<>();
try {
WXPay wxpay = new WXPay(wxPayAppConfig);
requestMap.put("body", body); // 商品描述
requestMap.put("out_trade_no", orderNo); // 商户订单号
requestMap.put("total_fee", String.valueOf((int)(amount*100))); // 总金额
requestMap.put("spbill_create_ip", "127.0.0.1"); // 终端IP
requestMap.put("trade_type", "APP"); // App支付类型
requestMap.put("notify_url", wxPayAppConfig.getPayNotifyUrl()); // 接收微信支付异步通知回调地址
// requestMap.put("sign", WXPayUtil.generateSignature(returnMap, requestMap.toString()));//微信支付签名
Map<String, String> resultMap = wxpay.unifiedOrder(requestMap);
//获取返回码
String returnCode = resultMap.get("return_code");
String returnMsg = resultMap.get("return_msg");
//若返回码为SUCCESS,则会返回一个result_code,再对该result_code进行判断
if ("SUCCESS".equals(returnCode)) {
String resultCode = resultMap.get("result_code");
String errCodeDes = resultMap.get("err_code_des");
if ("SUCCESS".equals(resultCode)) {
responseMap = resultMap;
}
}
if (responseMap == null || responseMap.isEmpty()) {
return ResultMap.error(returnCode,"获取预支付交易会话标识失败,"+returnMsg);
}
// 3、签名生成算法
Long time = System.currentTimeMillis() / 1000;
String timestamp = time.toString();
returnMap.put("appid", wxPayAppConfig.getAppID());
returnMap.put("partnerid", wxPayAppConfig.getMchID());
returnMap.put("prepayid", responseMap.get("prepay_id"));
returnMap.put("noncestr", responseMap.get("nonce_str"));
returnMap.put("timestamp", timestamp);
returnMap.put("package", "Sign=WXPay");
returnMap.put("sign", WXPayUtil.generateSignature(returnMap, wxPayAppConfig.getKey()));//微信支付签名
return ResultMap.ok().put("data", returnMap);
} catch (Exception e) {
logger.error("订单号:{},错误信息:{}", orderNo, e.getMessage());
return ResultMap.error("微信支付统一下单失败");
}
}
@Override
public ResultMap notify(String notifyStr) {
String xmlBack = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[报文为空]]></return_msg></xml> ";
try {
// 转换成map
Map<String, String> resultMap = WXPayUtil.xmlToMap(notifyStr);
WXPay wxpayApp = new WXPay(wxPayAppConfig);
if (wxpayApp.isPayResultNotifySignatureValid(resultMap)) {
String returnCode = resultMap.get("return_code"); //状态
String outTradeNo = resultMap.get("out_trade_no");//商户订单号
String transactionId = resultMap.get("transaction_id");
logger.info("***************获取支付信息状态******************");
logger.info("returnCode:{}",returnCode);
logger.info("outTradeNo:{}",outTradeNo);
logger.info("transactionId:{}",transactionId);
if (returnCode.equals("SUCCESS")) {
logger.info("***************支付成功咯,可以进行具体业务操作******************");
if (StringUtils.isNotBlank(outTradeNo)) {
/**
* 注意!!!
* 请根据业务流程,修改数据库订单支付状态,和其他数据的相应状态
*
*/
logger.info("微信手机支付回调成功,订单号:{}", outTradeNo);
return ResultMap.error("订单"+outTradeNo+"支付成功");
}
}else{
return ResultMap.error("支付失败,"+resultMap.get("return_msg"));
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public ResultMap refund(String orderNo, double amount, String refundReason){
if(StringUtils.isBlank(orderNo)){
return ResultMap.error("订单编号不能为空");
}
if(amount <= 0){
return ResultMap.error("退款金额必须大于0");
}
Map<String, String> responseMap = new HashMap<>();
Map<String, String> requestMap = new HashMap<>();
WXPay wxpay = new WXPay(wxPayAppConfig);
requestMap.put("out_trade_no", orderNo);
requestMap.put("out_refund_no", UUID.randomUUID().toString());
requestMap.put("total_fee", "订单支付时的总金额,需要从数据库查");
requestMap.put("refund_fee", String.valueOf((int)(amount*100)));//所需退款金额
requestMap.put("refund_desc", refundReason);
try {
responseMap = wxpay.refund(requestMap);
} catch (Exception e) {
e.printStackTrace();
}
String return_code = responseMap.get("return_code"); //返回状态码
String return_msg = responseMap.get("return_msg"); //返回信息
if ("SUCCESS".equals(return_code)) {
String result_code = responseMap.get("result_code"); //业务结果
String err_code_des = responseMap.get("err_code_des"); //错误代码描述
if ("SUCCESS".equals(result_code)) {
//表示退款申请接受成功,结果通过退款查询接口查询
//修改用户订单状态为退款申请中或已退款。退款异步通知根据需求,可选
//
return ResultMap.ok("退款申请成功");
} else {
logger.info("订单号:{}错误信息:{}", orderNo, err_code_des);
return ResultMap.error(err_code_des);
}
} else {
logger.info("订单号:{}错误信息:{}", orderNo, return_msg);
return ResultMap.error(return_msg);
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
SpringBoot集成app微信支付.rar (27个子文件)
WxPayService
src
main
resources
application.properties 844B
java
com
lmk
wxpay
WxPayMain.java 454B
controller
WxPayController.java 3KB
bean
ResultMap.java 1KB
WxResponse.java 978B
service
WxPayService.java 1010B
impl
WxPayServiceImpl.java 7KB
config
WxPayAppConfig.java 3KB
test
java
test.java 2KB
pom.xml 2KB
target
classes
META-INF
WxPayService.kotlin_module 16B
com
lmk
wxpay
controller
WxPayController.class 5KB
WxPayMain.class 709B
bean
ResultMap.class 2KB
WxResponse.class 1KB
service
WxPayService.class 478B
impl
WxPayServiceImpl.class 6KB
config
WxPayAppConfig.class 3KB
application.properties 844B
generated-test-sources
test-annotations
generated-sources
annotations
test-classes
test.class 3KB
.idea
$CACHE_FILE$ 140B
misc.xml 526B
encodings.xml 308B
workspace.xml 9KB
uiDesigner.xml 9KB
compiler.xml 767B
WxPayService.iml 81B
共 27 条
- 1
资源评论
迟到的微笑
- 粉丝: 417
- 资源: 52
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功