JAVA全系列 教程
3762个小节阅读:7092.3k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
xxxxxxxxxx
package com.itbaizhan.service;
import com.itbaizhan.controller.dto.OrderInfoDTO;
import com.itbaizhan.entity.OrderInfo;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.core.annotation.Order;
/**
* <p>
* 服务类
* </p>
*
* @author itbaizhan
* @since 04-21
*/
public interface IOrderInfoService extends IService<OrderInfo> {
/**
* 创建订单
* @param orderInfoDTO
* @return
*/
OrderInfo createOrder(OrderInfoDTO orderInfoDTO);
/**
* 根据订单编号查询订单信息
* @param orderNo
* @return
*/
OrderInfo findByOrderNo(String orderNo);
/**
*
* @param id 订单id
* @param codeUrl 二维码
*/
void saveCodeUrl(Long id,String codeUrl);
}
xxxxxxxxxx
/**
* 更新codeurl
* @param id id
* @param codeUrl 二维码
*/
@Override
public void saveCodeUrl(Long id, String codeUrl) {
UpdateWrapper<OrderInfo> updateWrapper = new UpdateWrapper<>();
// 设置要更新的字段 key = db属性
updateWrapper.set("code_url",codeUrl);
//条件
updateWrapper.eq("id",id);
baseMapper.update(null,updateWrapper);
}
xxxxxxxxxx
package com.itbaizhan.service.impl;
import com.alibaba.fastjson.JSON;
import com.itbaizhan.config.WxPayConfig;
import com.itbaizhan.entity.OrderInfo;
import com.itbaizhan.enums.wx.WxApiType;
import com.itbaizhan.service.IOrderInfoService;
import com.itbaizhan.service.IWxPaymentService;
import com.itbaizhan.vo.BaseResult;
import com.itbaizhan.vo.CodeEnum;
import com.itbaizhan.vo.PayInfoVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* 微信支付
*/
@Slf4j
@Service
public class WxPaymentServiceImpl implements IWxPaymentService {
@Autowired
private IOrderInfoService iOrderInfoService;// 订单接口
@Autowired
WxPayConfig wxPayConfig;// 微信支付配置参数
@Autowired
CloseableHttpClient wxPayClient;
/**
* Native下单
*
* @param orderNo
* @return
*/
@Transactional(rollbackFor = Exception.class)
@Override
public BaseResult nativePay(String orderNo) throws Exception {
log.info("*********** 开始 Native下单 *********");
// 1. 根据订单编号查询订单信息
OrderInfo orderInfo = iOrderInfoService.findByOrderNo(orderNo);
if (orderInfo == null) {
return BaseResult.error(CodeEnum.ORDER_ERROR);
}
if (orderInfo != null && !StringUtils.isEmpty(orderInfo.getCodeUrl())){
// 直接返回二维码
PayInfoVO payInfoVO = new PayInfoVO();
payInfoVO.setCodeUrl(orderInfo.getCodeUrl());
payInfoVO.setOrderNo(orderInfo.getOrderNo());
return BaseResult.ok(payInfoVO);
}
// 2. 调用统一下载API https://api.mch.weixin.qq.com/v3/pay/transactions/native
HttpPost httpPost = new HttpPost(wxPayConfig.getDomain().concat(WxApiType.NATIVE_PAY.getType()));
// 3. 组装请求参数
HashMap<String, Object> paramsMap = new HashMap<>();
paramsMap.put("appid", wxPayConfig.getAppid());// 应用id
paramsMap.put("mchid", wxPayConfig.getMchId());// 商户id
paramsMap.put("description", "test");// 商品描述
paramsMap.put("out_trade_no", orderInfo.getOrderNo());// 订单编号
paramsMap.put("notify_url", wxPayConfig.getDomain().concat(wxPayConfig.getNotifyDomain()));// 通知地址
HashMap<String, Object> amountMap = new HashMap<>();
amountMap.put("total", orderInfo.getTotalFee());
paramsMap.put("amount", amountMap);// 订单金额
// 4. 将参数转换为json字符串
String jsonString = JSON.toJSONString(paramsMap);
log.info("Native下单参数=======>{}" + jsonString);
// 5. 准备消息 boby
StringEntity entity = new StringEntity(jsonString, "UTF-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);
// 6. 准备请求头
httpPost.setHeader("Accept", "application/json");
// 7.完成签名并执行请求
CloseableHttpResponse response = wxPayClient.execute(httpPost);
try {
// 8. 拿出body 响应体
String bodyString = EntityUtils.toString(response.getEntity());
// 9. 获取响应状态码
int statusCode = response.getStatusLine().getStatusCode();
// 10 判断响应码
if (statusCode == 200) {
HashMap<String, String> responseMap = JSON.parseObject(bodyString, HashMap.class);
// 11 取出code_url
String codeUrl = responseMap.get("code_url");
// 更新code_url
iOrderInfoService.saveCodeUrl(orderInfo.getId(),codeUrl);
PayInfoVO payInfoVO = new PayInfoVO();
payInfoVO.setCodeUrl(codeUrl);
payInfoVO.setOrderNo(orderInfo.getOrderNo());
return BaseResult.ok(payInfoVO);
} else {
log.error("Native 下单失败响应码 " + statusCode + "返回结果" + bodyString);
return BaseResult.error(CodeEnum.PAYMENT_ERROR);
}
} finally {
response.close();
}
}
}