支付宝异步回调步骤+内网穿透++雷神商城项目

支付宝异步回调步骤+内网穿透++雷神商城项目

下面记录的步骤是基于雷神的谷粒商城项目,自己跟着该项目去做。项目大致方案是把商城业务分成数个微服务,访问所有微服务必须先过网关微服务;其次,利用nginx实现动静分离,也就是所有的请求都先进nginx,再转到网关。所以才有了下面的比较多的步骤。实际使用的话可以直接参考支付宝的demo程序就行。

  1. 获取内网穿透给自己的地址(这里用的https://zhexi.tech/)

    客户端:装这家网站提供的应用程序就好

    内网主机:这是自己业务配置的域名

    内网端口:本项目是把要填写的内网主机的域名映射到了nginx服务器地址,80就是nginx的默认端口

    外网域名:就是自己要得到的外网可以访问的域名信息。

  2. 配置支付宝支付成功的异步回调地址:(柔性事务-最大努力通知型方案)
private String notify_url = "http://**内网穿透给的地址**/payed/notify";
//注:/payed/notify是自己写对应该路径的业务逻辑
  1. 写上一步的业务逻辑,也即给支付宝返回数据,如果成功,返回success
@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";
        }
    }
}
  1. 配置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;
        }
    }
    
    
  2. 验证上述步骤,一定要发Post请求,可以用Postman
  3. 发现会返回登录页面,这是因为本项目中,支付是在订单微服务当中,这个服务加了拦截器,拦截未登录情况,所以把这个请求放行就行。就会来到支付页面(这里使用支付宝沙箱机制)

你可能感兴趣的:(支付宝异步回调步骤+内网穿透++雷神商城项目)