聚合支付,实现支付宝微信扫二维码直接跳转支付

具体要实现的功能:手机支付宝或微信扫描同一个二维码,跳转各自的支付

微信使用:jsapi支付

支付宝:wappay

上篇已写了如何实现内网穿透调试就不多叙述

1.判断客户端类型,从request的中将user-agent拉取下来,用contains查看userAgent中是否包含支付宝或者微信的关键字

        HttpServletRequest request = ServletUtils.getRequest();
        String userAgent = request.getHeader("user-agent");
/**
 * 支付宝支付头
 */
String ALI_PAY_CLIENT = "AlipayClient";

/**
 * 微信支付头
 */
String MICRO_MESSENGER = "MicroMessenger";

判断成功后直接相应的代码逻辑,我这边支付是另外一个平台所以要使用response.sendRedirect,必须使用这个去跳转不能使用什么restTemplate不然会报环境错误

2.微信上篇文章写的很清楚了这边着重说支付宝wapwap,手机电脑支付,支付宝相对于微信要简单很多demo如下:

    public Map<String, Object> gotoWAPPay(Map<String, Object> map) {
        log.info("获取到支付参数====={}",map);
        AlipayClient alipayClient = AlipayConfiguration.alipayClient(map);
        log.info("支付客户端信息====={}",alipayClient);
        // 订单模型
        String productCode = "QUICK_WAP_WAY";
        String orderNo = map.get(PayConstants.ORDERNO).toString();
        BigDecimal amount = new BigDecimal(map.get(PayConstants.AMOUNT).toString());
        BigDecimal divide = new BigDecimal("100");
        String remark =  map.get(PayConstants.REMARK).toString();
        AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
        model.setOutTradeNo(orderNo);
        model.setSubject(remark);
        model.setTotalAmount(amount.divide(divide).toString());
        model.setBody("支付测试,共需支付" + (amount.divide(divide).toString()) + "元");
        model.setProductCode(productCode);
        //model.setQrPayMode("0");

        AlipayTradeWapPayRequest wapPayRequest = new AlipayTradeWapPayRequest();
        wapPayRequest.setReturnUrl("");
        log.info("异步通知荔付地址为:{}", payProperties.getAliNotifyUrl()+orderNo);
        wapPayRequest.setNotifyUrl(payProperties.getAliNotifyUrl()+orderNo);
        wapPayRequest.setBizModel(model);
        wapPayRequest.setNeedEncrypt(PayConstants.NEED_ENCRYPT);

        String form = null;
        try {
            form = alipayClient.pageExecute(wapPayRequest,"GET").getBody();
        } catch (AlipayApiException e) {
            // Handle the exception appropriately, e.g., log or throw a custom exception.
            e.printStackTrace();
        }
        log.info("支付宝手机电脑支付下单回调===={}", form);
        Map<String, Object> resultMap = new HashMap<>();
//        try {
//            response.sendRedirect(form);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
        resultMap.put("url",form);
        return resultMap;
    }

这边有个坑,官方说get和post方法都可以,我们是直接让客户端跳转到支付,所以不需要前端,所以必须用get方法,返回的则是一个链接

form = alipayClient.pageExecute(wapPayRequest,"GET").getBody();

拿到链接后直接response.sendRedirect跳转过去即可

3.回调:

记得在之前填参数的时候将订单id带上,其他的就没什么了,相对于微信,支付宝还是简单很多,其他的代码就是自己项目上逻辑的差异

### 实现微信支付宝小程序二维码聚合方法 #### 解析现有方法 对于微信支付宝的小程序二维码聚合,一种可行的办法是在两者均采用关联普通链接二维码的方式。通过这种方式,可以确保同一链接生成的二维码能够在不同平台间正常工作[^2]。 具体来说,在地址设置时需要注意细节,比如在微信小程序控制台中的开发>开发设置部分,需特别关注路径结尾处斜杠的存在与否。这一步骤至关重要,因为不正确的路径格式可能会导致跳转失败。当一切准备就绪后,可以通过特定模式下的URL(如`xxx.com/xxx/*`),其中星号位置可被替换为具体的请求名称,例如`test.do`,用于触发服务器端逻辑处理并最终重定向至目标页面——即由另一方(如支付宝)解析出的目标URL[^1]。 #### 技术实现要点 为了使上述流程顺利运作,还需要考虑如下几个方面: - **域名一致性**:保证微信支付宝所使用的域名一致是非常重要的前提条件之一。 - **后台接口设计**:需要构建一个中间层服务来接收来自二维码后的HTTP请求,并依据请求源判断应转向哪个应用的小程序入口。此过程可能涉及到跨域资源共享(CORS)政策调整以及安全验证机制的设计。 ```java // Java Servlet 示例代码片段展示如何根据不同参数决定转发目的地 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String sourceApp = request.getParameter("source"); // 假设传递了一个表示来源app的参数 if ("wechat".equals(sourceApp)) { // 转向微信小程序对应的URL response.sendRedirect(WECHAT_MINI_PROGRAM_URL); } else if ("alipay".equals(sourceApp)) { // 或者是支付宝小程序的URL response.sendRedirect(ALIPAY_MINI_PROGRAM_URL); } } ``` 此外,值得注意的是,支付宝小程序必须已经正式上线才能够配置与其相关的普通链接规则,这对于前期测试阶段会带来一定的不便之处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值