我是靠谱客的博主 缥缈保温杯,最近开发中收集的这篇文章主要介绍支付宝如何获取buyer_id (即user_id)。支付宝服务窗(生活号)支付方式,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

背景:
  • 最近需要利用支付宝中alipay.trade.create 这个接口,做企业版固定收款码。(我们作为服务商)。
  • 在交易过程中,发现需要上送buyer_id,辗转多处得知,buyer_id就是用户的user_id,需要使用用户信息授权接口https://docs.open.alipay.com/289/105656。
  • 注意:如果在用户无感的情况下获取user_id,需要将scope参数传入auth_base是静默授权。(开始就是这个错了,导致一直需要用户点击授权)。
      参考:https://openclub.alipay.com/read.php?tid=7078&fid=72&ant_source=zsearch
    下面开始写完整步骤,步骤有点繁琐,逐步耐心地对着沙箱看:
1. 首先申请沙箱环境。
  • 1.1. 进入支付宝开放平台(https://docs.open.alipay.com/200/105311),点击蓝色沙箱字样后进入登录界面,使用个人账户登录,选择自主研发者,注册后得到沙箱环境的PID(即UID)和APPID。
    这里写图片描述

  • 1.2按照操作指南,设置公钥。
    这里写图片描述

  • 1.3 设置授权回调地址。
    这里写图片描述
    这个地址,只要求配置到域名就行

  • 1.4 授权回调地址作用:
    我们的授权分为2步。总体说 拼接授权链接—>发送接口alipay.system.oauth.token接口

  • 1.4.1 第一步,拼接授权链接
    拼接授权链接(链接中有redirect_url, redirect_uri与应用配置的授权回调地址域名部分必须一致),访问该链接,支付宝会把响应参数auth_code回调跳转到这个redirect_url上。。这一步获取到auth_code,并保存。
    示例授权链接:https://openauth.alipaydev.com/oauth2/publicAppAuthorize.htm?app_id=2016101800718925&scope=auth_base&redirect_uri=https%3A%2F%2Fwww.baidu.com%2F
    注意:

    • a. 沙箱环境,是alipaydev.com 正式的是alipay.com。
    • b. 链接中的scope一定设置为auth_base。才能做到用户无感知,不需要手动点击授权应用。
  • 1.4.2 第二步,利用第一步获取到的auth_code,发送接口alipay.system.oauth.token。既可以得到user_id。代码如下。

//https://openapi.alipaydev.com/gateway.do 。莫要跟正式环境弄混。正式的不带dev
//APP_ID位沙箱里面写的appid。APP_PRIVATE_KEY为自己的私钥,用于报文签名.  ALIPAY_PUBLIC_KEY 这个是支付宝公钥,用于验签
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipaydev.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2"); 
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
request.setCode("2e4248c2f50b4653bf18ecee3466UC18");//这个就是第一步获取的auth_code
request.setGrantType("authorization_code");//这个固定值,参考https://docs.open.alipay.com/api_9/alipay.system.oauth.token
try {
    AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(request);
    System.out.println(oauthTokenResponse.getBody());
     System.out.println(oauthTokenResponse.getUserId());
} catch (AlipayApiException e) {
    //处理异常
    e.printStackTrace();
}

打印如下,返回user_id:2088102176179015

{"alipay_system_oauth_token_response":{"access_token":"authbseB943644a58e6242acb91078770da52X01","alipay_user_id":"2088102176179015","expires_in":1296000,"re_expires_in":31536000,"refresh_token":"authbseB14f174b8ef314050a4f3682066fd2A01","user_id":"2088102176179015"},"sign":"GgOx60CAy56LvQ8TPnaTZqUZfvgvFnlvwLH2I3XJ6vfygBqbf0gqBkfI1krVZ702XTLRwfExcUW7D6Wlprz/u+AF4YBUhaMhbXXp9D/MOO/Kn7ITti3g3qsltLU2uK3WIDG9Jn86kNUnencrxw2fmBSeCMZv20C6WQhZtc76U7hEEVM+7Qys4glYVtM8pFIq1F4GSP0FY6xXQPYKfBGq5R5VTNLOz4I1t3ynuVPu8iZprCEPRpybNXBLAW3Pny27LWsIbo2wSeCKW6SR/Z8JaIVl+0uHTbm3O2357e01k8aA1dwSfk+0XfZqpHk6bJ2NjD5Yt6QqoA2zatmXMHdfgQ=="}

2088102176179015
  • 1.5 思考,如何做固定收款码?
    分为2步
  • 1.5.1 我们在拼接授权链接时,可以把后面的redirect_url,配置成我们自己的h5支付页面,那么,当用支付宝扫码访问这个链接后,支付宝会自动返回到这个h5支付页面,回调带参数auth_code,此时我们就已经获取到了auth_code。
    注:链接中还有个参数state。需要的业务参数可以统一通过state参数传递。如果该二维码的对应商户号。当然也可以拼在redirect_url后面。
  • 1.5.2接着在当前h5页面填写金额,然后发后台交易,可以在后台连续发2步接口,先发上面的alipay.system.oauth.token接口,利用上一步的auth_code获取到user_id,即buyer_id;再发下单接口alipay.trade.create。 返回trade_no
  • 1.6 利用1.5接口返回的trade_no,唤醒支付宝。唤醒js使用支付宝自带的方法。https://docs.open.alipay.com/common/105591
    https://openclub.alipay.com/read.php?tid=248&fid=56&ant_source=zsearch
    https://myjsapi.alipay.com/alipayjsapi/
    为方便阅读,这里写了个现成的。只需要把tradeNo代入。支付宝内扫码访问该页面,页面内即可唤醒支付宝支付
<html>
<head>
    <script src="http://libs.baidu.com/jquery/1.7.2/jquery.min.js"></script>
    <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.min.js"></script>

    <script type="text/javascript">
        // 调试时可以通过在页面定义一个元素,打印信息,使用alert方法不够优雅
        function log(obj) {
            $("#result").append(obj).append(" ").append("<br />");
        }
        $(document).ready(function(){

            // 页面载入完成后即唤起收银台
            // 此处${tradeNO}为模板语言语法,实际调用样例类似为tradePpay("2016072621001004200000000752")
            tradePay("2018061321001004010200659043");//这里就是tradeNo
        });

        // 由于js的载入是异步的,所以可以通过该方法,当AlipayJSBridgeReady事件发生后,再执行callback方法
        function ready(callback) {
            if (window.AlipayJSBridge) {
                callback && callback();
            } else {
                document.addEventListener('AlipayJSBridgeReady', callback, false);
            }
        }

        function tradePay(tradeNO) {
            ready(function(){
                // 通过传入交易号唤起快捷调用方式(注意tradeNO大小写严格)
                AlipayJSBridge.call("tradePay", {
                    tradeNO: tradeNO
                }, function (data) {
                    log(JSON.stringify(data));
                    if ("9000" == data.resultCode) {
                        log("支付成功");
                    }
                });
            });
        }
    </script>

</head>
<body>
</body>
</html>

最后

以上就是缥缈保温杯为你收集整理的支付宝如何获取buyer_id (即user_id)。支付宝服务窗(生活号)支付方式的全部内容,希望文章能够帮你解决支付宝如何获取buyer_id (即user_id)。支付宝服务窗(生活号)支付方式所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部