Controller
@RequestMapping(value = {"/api/wxjspay" })
@RestController
@Slf4j
@Api(value = "微信扫码支付相关",tags = "微信扫码支付相关")
public class TenJSPayController extends BaseController {
@Autowired
private TenPayService tenPayService;
/**
* @Description: 微信扫码付支付
*/
@PostMapping(value = "/payRequest")
@ApiOperation("微信扫码付支付")
public Result payRequest(@RequestBody MallOrderJSPayDto mallOrderPayDto, HttpServletRequest request){
Map<String, String> map = new HashMap<String, String>();
try {
map = tenPayService.wxQrPayment(mallOrderPayDto);
return super.success(map);
} catch (Exception e) {
e.printStackTrace();
}
return super.error();
}
/**
* @Description: 微信扫码付支付回调
*/
@PostMapping(value = "/tenPayOrderCallBack")
@ApiOperation("微信扫码付支付回调")
public Map<String, String> tenPayOrderCallBack(HttpServletRequest request){
Map<String, String> map = new HashMap<String, String>();
try {
tenPayService.tenJSPayCallBack(request);
map.put("return_code", "SUCCESS");
map.put("return_msg", "OK");
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
/**
* @Description: 微信扫码付订单状态查询
*/
@PostMapping(value = "/getWxJspayStatus")
@ApiOperation("微信扫码付订单状态查询")
public Result getWxJspayStatus(@RequestParam("orderId")String orderId){
Map<String, Object> map = new HashMap<String, Object>();
try {
map = tenPayService.getWxJspayStatus(orderId);
return super.success(map);
} catch (Exception e) {
e.printStackTrace();
}
return super.error();
}
}
service:
public interface TenPayService {
public Map<String, String> wxQrPayment(MallOrderJSPayDto mallOrderPayDto) throws Exception;
public TenPayVO tenJSPayCallBack(HttpServletRequest request) throws Exception;
public Map<String, Object> getWxJspayStatus(String orderId)throws Exception;
}
Impl:
@Override
public Map<String, String> wxQrPayment(MallOrderJSPayDto mallOrderPayDto) throws Exception {
TenpayConfig tenpayConfig = new TenpayConfig();
tenpayConfig.setAppId("");
tenpayConfig.setKey("");
tenpayConfig.setMchId("");
tenpayConfig.setPackageValue(Consts.PACKAGE_VALUE);
MyPayConfig myPayConfig = new MyPayConfig(tenpayConfig);
WXPay wxPay = new WXPay(myPayConfig);
//微信统一下单
Map<String,String> paramsMap = new HashMap<>();
//随机字符串
String nonce_str = WXPayUtil.generateNonceStr();
paramsMap.put("nonce_str", nonce_str);
paramsMap.put("sign_type","MD5");
//描述
paramsMap.put("body", "扫码下单");
//商户订单号(支付编号)
//支付编号
String orderNum = PayUtils.getOrderNumber();
paramsMap.put("out_trade_no", orderNum);
//支付金额,金额单位为 分
BigDecimal totalAmount = null;
//TODO 测试使用
int totalFee = (int) (1);
paramsMap.put("total_fee", String.valueOf(totalFee));
//回调地址
paramsMap.put("notify_url", Consts.TENPAY_QR_CALLBACK);
//交易类型
paramsMap.put("trade_type", Consts.TRADE_TYPE_NATIVE);
//用户端ip
String spbillCreateIp = "";
InetAddress inetAddress = InetAddress.getLocalHost();
if (inetAddress != null) {
spbillCreateIp = inetAddress.getHostAddress();
}
paramsMap.put("spbill_create_ip", spbillCreateIp);
Map<String,String> resp = wxPay.unifiedOrder(paramsMap);
byte[] bytes = QRCodeUtil.encodeReturnFile(resp.get("code_url"));
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
MultipartFile temFile = new MockMultipartFile("file", byteArrayInputStream);
byteArrayInputStream.close();
String url = ossUtil.upload(temFile);
log.info("url:{}",url);
Map<String,String> mapReturn = Maps.newHashMap();
mapReturn.put("url",url);
mapReturn.put("orderNum",orderNum);
return mapReturn;
}
@Override
public TenPayVO tenJSPayCallBack(HttpServletRequest request) throws Exception {
log.info("weixinpay callBack start ==============================");
InputStream inputStream = request.getInputStream();
StringBuffer resXml = new StringBuffer();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
String str;
while ((str = bufferedReader.readLine()) != null) {
resXml.append(str);
}
bufferedReader.close();
inputStream.close();
log.info("微信回调报文: " + resXml);
// TenPayVO tenPayVO = this.tenPayCallBackInfo(resXml.toString(), "xml", "");
Map<String, Object> resHashMap = (Map<String, Object>) TenPayUtils.readXml(resXml.toString(), "xml", "");
SortedMap<String, Object> resMap = new TreeMap<String, Object>(resHashMap);
log.info(" 微信支付回调返回结果:{}",resMap);
//微信返回状态码
if (!resMap.get("return_code").equals("SUCCESS")) {
log.error("微信支付回调连接失败: " + resMap.get("return_msg"));
throw new Exception("微信支付回调连接失败");
}
//业务结果
if (!resMap.get("result_code").equals("SUCCESS")) {
log.error("err_code: " + resMap.get("err_code"), "err_code_des: " + resMap.get("err_code_des"));
throw new Exception(resMap.get("err_code_des").toString());
}
TenPayUtils tenPayUtils = new TenPayUtils();
//校验签名-要传递加签用的key
String sign = tenPayUtils.createSign(resMap, "UTF-8","key");
if (!sign.equals(resMap.get("sign"))) {
log.error("微信支付回调签名不正确");
throw new Exception("微信支付回调签名不正确");
}
TenPayVO tenPayVO = new TenPayVO();
//商户订单号
tenPayVO.setOutTradeNo((String) resMap.get("out_trade_no"));
//业务结果
tenPayVO.setResultCode((String) resMap.get("result_code"));
//签名方式
tenPayVO.setSignType(Consts.SIGN_TYPE);
//签名
tenPayVO.setSign((String) resMap.get("sign"));
//交易类型
tenPayVO.setTradeType(Consts.TRADE_TYPE_NATIVE);
//交易状态
tenPayVO.setTradeState((String) resMap.get("trade_state"));
//商户号
tenPayVO.setMchId((String) resMap.get("mch_id"));
//付款银行
tenPayVO.setBankType((String) resMap.get("bank_type"));
//交易金额
BigDecimal totalFee = new BigDecimal((String) resMap.get("total_fee"));
totalFee = totalFee.divide(new BigDecimal(100));
tenPayVO.setTotalFee(totalFee);
//币种
if (resMap.containsKey("fee_type")) {
tenPayVO.setFeeType((String) resMap.get("fee_type"));
}
//微信支付订单号
tenPayVO.setTransactionId((String) resMap.get("transaction_id"));
//支付完成时间
tenPayVO.setTimeEnd((String) resMap.get("time_end"));
if (tenPayVO != null && tenPayVO.getResultCode().equals("SUCCESS")){
log.info("微信扫码付回调成功==================");
}
return null;
}
@Override
public Map<String, Object> getWxJspayStatus(String orderId) throws Exception {
TenpayConfig tenpayConfig = new TenpayConfig();
tenpayConfig.setAppId("");
tenpayConfig.setKey("");
tenpayConfig.setMchId("");
tenpayConfig.setPackageValue(Consts.PACKAGE_VALUE);
MyPayConfig myPayConfig = new MyPayConfig(tenpayConfig);
WXPay wxPay = new WXPay(myPayConfig);
Map<String, String> paramsMap = new HashMap<>();
//随机字符串
String nonce_str = WXPayUtil.generateNonceStr();
paramsMap.put("nonce_str", nonce_str);
paramsMap.put("out_trade_no", orderId);
Map<String,String> resp = wxPay.orderQuery(paramsMap);
log.info("resp:{}",resp);
Map<String,Object> maps = Maps.newHashMap();
maps.put("type",Objects.nonNull(resp.get("result_code")) && resp.get("result_code").equals("SUCCESS") ? 0 : resp.get("result_code"));
maps.put("data",resp.get("trade_state_desc"));
return maps;
}
上传二维码到阿里云就不写了,有需要的同学可以去找一下我上一篇支付宝扫码付中有.