一码多付-------支付宝/微信扫码支付(H5支付) 静态码

为了实现一码多付 

生成一个通用二维码  通过支付宝或者微信都可以支付

1 使用支付宝扫码支付

支付宝提供了 扫码枪,用户扫商户动态生成的码 这样会根据用户不同或者金额不同需要动态的码,这样显然是不可以的

所以要实现商户生成一个静态码,并且商户能获取订单信息,后台通知只有实现一码多付   JSAPI

支付宝官方文档:https://openclub.alipay.com/read.php?tid=5458&fid=56

总结下来文档无非就是一下几点:

 1 申请一个账号(我申请的是一个沙箱环境的),需要生产环境的自行去申请即可,简单

 2 一码多付使用到支付宝的【alipay.trade.create-统一收单交易创建接口】需要签约当面付接口才能有这个接口的权限

 3 使用【用户信息授权接口】只需要在appid添加功能即可不需要签约。 步骤二 需要用到 buyer_id 用户支付宝账号

这样就是一个正常流程了

 第二步创建统一收单订单,buyer_id 不能为空,所以这就依赖第三步的用户信息授权获取用户的id

需要用户授权获取用户id   https://docs.open.alipay.com/289/105656

参数名 是否必须 长度 描述
app_id 16 开发者应用的app_id; 相同支付宝账号下,不同的app_id获取的token切忌混用。
scope 不定,取决于请求授权时scope个数 接口权限值,目前只支持auth_user(获取用户信息、网站支付宝登录)、auth_base(用户信息授权)、auth_ecard(商户会员卡)、auth_invoice_info(支付宝闪电开票)、auth_puc_charge(生活缴费)五个值;多个scope时用”,”分隔,如scope为”auth_user,auth_ecard”时,此时获取到的access_token,既可以用来获取用户信息,又可以给用户发送会员卡。
redirect_uri 100 授权回调地址,是经过URLENCODE转义 的url链接(url必须以http或者https开头); 在请求之前,开发者需要先到开发者中心对应应用内,配置授权回调地址。 redirect_uri与应用配置的授权回调地址域名部分必须一致。
state 100 商户自定义参数,用户授权后,重定向到redirect_uri时会原样回传给商户。 为防止CSRF攻击,建议开发者请求授权时传入state参数,该参数要做到既不可预测,又可以证明客户端和当前第三方网站的登录认证状态存在关联。

scope: auth_user 能获取用户的所有信息,auth_base(这个也叫静默授权:对用户来讲是没有感知的,不会弹出授权页面,但是这个只能获到用户的用户ID,无法获取用户的其他信息,这个也正是我们需要的)

https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=2018062060405677&scope=auth_base&redirect_uri=你的授权回调地址(后面可以拼接参数:http://www.baidu.com?业务参数=xxxx)

这样获取到了用户的authCode: 支付宝就会回调配置的授权回调地址 

例如: 授权回调地址?业务参数=xxx&auchCode=XXXXX

下一步:auth_code换取access_token与user_id

AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(request);
LogHelper.debug(logger, "用户ID userId={0}", oauthTokenResponse.getUserId());
resoponse=oauthTokenResponse.getBody();
requestData.put("buyer_id", oauthTokenResponse.getUserId());

到这里基本上完成三分之一了

下一步创建订单:这个没啥特别的直接上代码 

this.initPaymentConfig(orderInfoModel.getProjectId().toString(), PaymentChannelEnum.ALIPAY);
Map param = this.getRequestParam(orderInfoModel, null);
AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();
request.setNotifyUrl(this.notifyUrl);
request.setBizContent("{" +
        "\"out_trade_no\":\"" +orderInfoModel.getOrderId()+"\","+
        "\"total_amount\":\"" +param.get("amount")+"\","+
        "\"subject\":\""+param.get("subject")+"\"," +
        "\"buyer_id\":\""+param.get("buyer_id")+"\"," +
        "\"timeout_express\":\"30m\"" +
        "  }");
    AlipayTradeCreateResponse response = alipayClient.execute(request);
    if(response.isSuccess()){
        return response.getTradeNo();
      }

返回订单的订单号 TradeNo: 在H5页面 通过订单号唤起收银台

一共会涉及到两个页面: 第一个页面用户扫码 (中转页面:用户获取用户的code)

1 页面

window.location.href=https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=2018062060405677&scope=auth_base&redirect_uri=你的授权回调地址(后面可以拼接参数:http://www.baidu.com?业务参数=xxxx)

支付宝会将auth_code 传递到 设置的授权回调地址,然后输入金额的页面,最后再js页面拉起收银台输入金额支付

2 页面




    
    
    
    付款


<#--

付款

-->

您正在向 ${(projectName)!}付款

支付

上面是调用支付宝和微信收银台的js 代码

 

    
    https://docs.open.alipay.com/common/105591
    支付宝静默授权: https://www.jianshu.com/p/665e398a66e4
    参考文档:https://blog.csdn.net/a718515028/article/details/80684228
    
    
    
    微信静默授权:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
    参考文档:https://blog.csdn.net/qq_29863725/article/details/78620198
    https://blog.csdn.net/qq_32404273/article/details/78126829
 

 

 

 

 

 

 

你可能感兴趣的:(支付)