支付宝异步回调步骤+内网穿透++雷神商城项目
作者:互联网
支付宝异步回调步骤+内网穿透++雷神商城项目
下面记录的步骤是基于雷神的谷粒商城项目,自己跟着该项目去做。项目大致方案是把商城业务分成数个微服务,访问所有微服务必须先过网关微服务;其次,利用nginx实现动静分离,也就是所有的请求都先进nginx,再转到网关。所以才有了下面的比较多的步骤。实际使用的话可以直接参考支付宝的demo程序就行。
-
获取内网穿透给自己的地址(这里用的https://zhexi.tech/)
客户端:装这家网站提供的应用程序就好
内网主机:这是自己业务配置的域名
内网端口:本项目是把要填写的内网主机的域名映射到了nginx服务器地址,80就是nginx的默认端口
外网域名:就是自己要得到的外网可以访问的域名信息。
-
配置支付宝支付成功的异步回调地址:(柔性事务-最大努力通知型方案)
private String notify_url = "http://**内网穿透给的地址**/payed/notify";
//注:/payed/notify是自己写对应该路径的业务逻辑
@RestController
public class OrderPayedListener {
@Autowired
OrderService orderService; //自己的业务相关
@Autowired
AlipayTemplate alipayTemplate; //抽取出的支付的模板
@PostMapping("/payed/notify") //处理该post请求
public String handleAlipayed(PayAsyncVo payAsyncVo, HttpServletRequest request) throws AlipayApiException, UnsupportedEncodingException {
// 只要我们收到了支付宝给我们发的异步通知,告诉我们订单支付成功,返回success,支付宝就再也不通知了
System.out.println("支付宝通知到位了...");
// 处理支付结果
// 验签 下面验签都是支付宝的demo程序
Map<String,String> params = new HashMap<String,String>();
Map<String,String[]> requestParams = request.getParameterMap();
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
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] + ",";
}
params.put(name, valueStr);
}
boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayTemplate.getAlipay_public_key(), alipayTemplate.getCharset(), alipayTemplate.getSign_type()); //调用SDK验证签名
if(signVerified){
System.out.println("签名验证成功");
String result = orderService.handlePayResult(payAsyncVo);
return result;
} else {
System.out.println("签名验证失败");
return "error";
}
}
}
-
配置nginx
server { listen 80; server_name taomall.com *.taomall.com btkpqr3t2y.52http.tech; #上面最后一个就是之前内网穿透的地址 #项目中的静态资源访问路径配置 location /static/ { root /usr/share/nginx/html; } #配置了支付成功请求后==>nginx==项目服务的路径映射 location /payed/ { proxy_set_header Host order.taomall.com; proxy_pass http://taomall; } #项目中除了处理支付宝异步消息,其余的域名到服务器的路径映射 location / { proxy_set_header Host $host; #在支付中这个host是人家提供内网穿透的host,肯定要单独写 proxy_pass http://taomall; } }
-
验证上述步骤,一定要发Post请求,可以用Postman
-
发现会返回登录页面,这是因为本项目中,支付是在订单微服务当中,这个服务加了拦截器,拦截未登录情况,所以把这个请求放行就行。就会来到支付页面(这里使用支付宝沙箱机制)
标签:异步,String,支付宝,++,valueStr,nginx,values,taomall,内网 来源: https://blog.csdn.net/weixin_51948450/article/details/113808322