JAVA全系列 教程
3762个小节阅读:7088.2k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
xxxxxxxxxx
package com.itbaizhan.utils;
import com.wechat.pay.contrib.apache.httpclient.auth.Verifier;
import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 微信通知验签
*/
public class WxVerifierUtils {
/**
* 验签
* @param request
* @param verifier
* @param body
* Content-Type: application/json; charset=utf-8
* Content-Length: 2204
* Connection: keep-alive
* Keep-Alive: timeout=8
* Content-Language: zh-CN
* Request-ID: e2762b10-b6b9-5108-a42c-16fe2422fc8a
* Wechatpay-Nonce: c5ac7061fccab6bf3e254dcf98995b8c
* Wechatpay-Signature: CtcbzwtQjN8rnOXItEBJ5aQFSnIXESeV28Pr2YEmf9wsDQ8Nx25ytW6FXBCAFdrr0mgqngX3AD9gNzjnNHzSGTPBSsaEkIfhPF4b8YRRTpny88tNLyprXA0GU5ID3DkZHpjFkX1hAp/D0fva2GKjGRLtvYbtUk/OLYqFuzbjt3yOBzJSKQqJsvbXILffgAmX4pKql+Ln+6UPvSCeKwznvtPaEx+9nMBmKu7Wpbqm/+2ksc0XwjD+xlvlECkCxfD/OJ4gN3IurE0fpjxIkvHDiinQmk51BI7zQD8k1znU7r/spPqB+vZjc5ep6DC5wZUpFu5vJ8MoNKjCu8wnzyCFdA==
* Wechatpay-Timestamp: 1554209980
* Wechatpay-Serial: 5157F09EFDC096DE15EBE81A47057A7232F1B8E1
* Cache-Control: no-cache, must-revalidate
* @return
*/
public static boolean verifier(HttpServletRequest request, Verifier verifier, String body) throws UnsupportedEncodingException {
// 1. 随机串
String nonce = request.getHeader("Wechatpay-Nonce");
// 2. 获取微信传递过来签名
String signature = request.getHeader("Wechatpay-Signature");
// 3. 证书序列号
String serial = request.getHeader("Wechatpay-Serial");
// 4. 时间戳
String timestamp = request.getHeader("Wechatpay-Timestamp");
// 5. 构造签名串
/**
* 应答时间戳\n
* 应答随机串\n
* 应答报文主体\n
*/
String signstr = Stream.of(timestamp,nonce,body).collect(Collectors.joining("\n","","\n"));
return verifier.verify(serial,signstr.getBytes("utf-8"),signature);
}
public static void main(String[] args) {
String collect = Stream.of("a", "b", "c").collect(Collectors.joining("?", "=", "%"));
System.out.println(collect);
}
}
xxxxxxxxxx
package com.itbaizhan.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.itbaizhan.config.WxPayConfig;
import com.itbaizhan.service.IWxPaymentService;
import com.itbaizhan.utils.HttpUtils;
import com.itbaizhan.utils.WxVerifierUtils;
import com.itbaizhan.vo.BaseResult;
import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants;
import com.wechat.pay.contrib.apache.httpclient.auth.Verifier;
import com.wechat.pay.contrib.apache.httpclient.util.AesUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
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.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 微信支付接口
*/
@Slf4j
@RestController
@RequestMapping("/api/wx-pay")
public class WxPayController {
@Autowired
private IWxPaymentService iWxPaymentService;
@Autowired
private WxPayConfig wxPayConfig;
@Autowired
private Verifier verifier;
/**
* Native下单
* weixin://wxpay/bizpayurl?pr=e5ta1spzz
* @param orderNo
* @return
*/
@PostMapping("/native/{orderNo}")
public BaseResult nativePay(@PathVariable String orderNo) throws Exception {
BaseResult baseResult = iWxPaymentService.nativePay(orderNo);
return baseResult;
}
//api/wx-pay/native/notify
/**
* 微信支付通知
* @param request
* @param response
* @return
*/
@PostMapping("/native/notify")
public String notify(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException, GeneralSecurityException {
HashMap<String, String> responseMap = new HashMap<>();
// 1. 获取报文body
String body = HttpUtils.readData(request);
// 2. 把json转换为map
HashMap<String,Object> bodyMap = JSON.parseObject(body, HashMap.class);
log.info("支付通知id======> {}",bodyMap.get("id"));
log.info("支付通知完整数据=======> {}",body);
//TODO: 签名验证 确保是微信给我们发的消息
boolean verifier = WxVerifierUtils.verifier(request, this.verifier, body);
if (!verifier){
response.setStatus(200);
responseMap.put("code","FAIL");
responseMap.put("message","失败");
return JSON.toJSONString(responseMap);
}
//TODO: 处理订单
/**
*
{
"code": "FAIL",
"message": "失败"
}
*/
// 成功应答: 成功就是200 否则就是失败的应答
response.setStatus(200);
responseMap.put("code","SUCCESS");
responseMap.put("message","成功");
return JSON.toJSONString(responseMap);
}
/**
* 验证签名
*
* @param serialNo 微信平台-证书序列号
* @param signStr 自己组装的签名串
* @param signature 微信返回的签名
* @return
* @throws UnsupportedEncodingException
*/
private boolean verifiedSign(String serialNo, String signStr, String signature) throws UnsupportedEncodingException {
return verifier.verify(serialNo, signStr.getBytes("utf-8"), signature);
}
private String decryptBody(String body) throws UnsupportedEncodingException, GeneralSecurityException {
AesUtil aesUtil = new AesUtil(wxPayConfig.getApiV3Key().getBytes("utf-8"));
JSONObject object = JSON.parseObject(body);
JSONObject resource = object.getJSONObject("resource");
String ciphertext = resource.getString("ciphertext");
String associatedData = resource.getString("associated_data");
String nonce = resource.getString("nonce");
return aesUtil.decryptToString(associatedData.getBytes("utf-8"),nonce.getBytes("utf-8"),ciphertext);
}
}