• App支付宝登录授权


    一、在支付宝开放平台申请App应用,并且配置后台信息

         https://openhome.alipay.com/platform/appManage.htm#/apps

         填写自己的申请信息

     

    添加应用功能

    开发者在开发过程中,可以添加自己需要的功能到“功能列表”。不同的功能会有不同的使用条件,如果某个功能的使用条件为签约,则使用者在使用此功能前,需要签约对应的产品。自研型应用和第三方应用的签约方式略有差异,具体签约方式可参考 签约功能。 

    配置应用环境

    https://docs.open.alipay.com/200/105310

      

     密钥生成:使用工具生成

     https://docs.open.alipay.com/291/105971

     提交应用审核

    二、支付宝登录流程图

    步骤一:使用App进行授权确认:

               调用原生支付宝Sdk唤醒支付宝进行授权:https://docs.open.alipay.com/218/105325/

               备注:参数说明:

             app_id:

             

             pid:

             

             taget_id:后台自定义参数,自己测试也可以随便定义;

             RSA2_PRIVATE和RSA_PRIVATE为签名方式的私钥,在申请配置信息会有 

    public static final String RSA2_PRIVATE = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwgg"

            

             一般放在后台,测试可以放到移动端进行测试;

            Android端集成SDK进行

            1.调用方法   

      /**
         * 支付宝账户授权业务示例
         */
        private Activity mContext;
        private OnAliCallBack onAliCallBack;
    
        public void startAuthorization(final Activity mContext, OnAliCallBack onAliCallBack) {
            this.onAliCallBack = onAliCallBack;
            this.mContext = mContext;
            if (TextUtils.isEmpty(PID) || TextUtils.isEmpty(APPID)
                    || (TextUtils.isEmpty(RSA2_PRIVATE) && TextUtils.isEmpty(RSA_PRIVATE))
                    || TextUtils.isEmpty(TARGET_ID)) {
                Toast.makeText(mContext, "参数不全", Toast.LENGTH_SHORT).show();
                return;
            }
    
            /*
             * 这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成;
             * 真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成;
             * 防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险;
             *
             * authInfo 的获取必须来自服务端;
             */
            boolean rsa2 = (RSA2_PRIVATE.length() > 0);
            Map<String, String> authInfoMap = OrderInfoUtil2_0.buildAuthInfoMap(PID, APPID, TARGET_ID, rsa2);
            String info = OrderInfoUtil2_0.buildOrderParam(authInfoMap);
            Log.e("ALi", info);
            String privateKey = rsa2 ? RSA2_PRIVATE : RSA_PRIVATE;
            String sign = OrderInfoUtil2_0.getSign(authInfoMap, privateKey, rsa2);
            final String authInfo = info + "&" + sign;
            Runnable authRunnable = new Runnable() {
                @Override
                public void run() {
                    // 构造AuthTask 对象
                    AuthTask authTask = new AuthTask(mContext);
                    // 调用授权接口,获取授权结果
                    Map<String, String> result = authTask.authV2(authInfo, true);
                    Message msg = new Message();
                    msg.what = SDK_AUTH_FLAG;
                    msg.obj = result;
                    mHandler.sendMessage(msg);
                }
            };
            // 必须异步调用
            Thread authThread = new Thread(authRunnable);
            authThread.start();
        }
    

       

    2.回调信息

    private static final int SDK_AUTH_FLAG = 2;
        @SuppressLint("HandlerLeak")
        private Handler mHandler = new Handler() {
            @SuppressWarnings("unused")
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case SDK_AUTH_FLAG: {
    //                    @SuppressWarnings("unchecked")
                        AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true);
                        String resultStatus = authResult.getResultStatus();
                        // 判断resultStatus 为“9000”且result_code
                        // 为“200”则代表授权成功,具体状态码代表含义可参考授权接口文档
                        if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
                            // 获取alipay_open_id,调支付时作为参数extern_token 的value
                            // 传入,则支付账户为该授权账户
                            Toast.makeText(mContext, "授权成功", Toast.LENGTH_SHORT).show();
                        } else {
                            // 其他状态值则为授权失败
                            Toast.makeText(mContext, "授权失败", Toast.LENGTH_SHORT).show();
                        }
                        break;
                    }
                    default:
                        break;
                }
            }
    
            ;
        };
    

        

           3.授权成功之后,通过authResult.getAuthCode()  请求后台,后台通过authcode获取Token请求用户信息,把需要信息传给移动端

           移动端Demo如下:PostOfficeTwo

       

           

    
    
    

        

         

  • 相关阅读:
    https://github.com/zyq025/DotNetCoreStudyDemo/blob/main/HttpClientConsoleDemo/Program.cs
    NETCORE TASK多线程的使用
    .NetCore简单封装基于IHttpClientFactory的HttpClient请求
    Netcore中简单使用MemoryCache
    LinQ To Object 基本用法
    SelectMany 和 Select的区别
    List 转换成字符串
    【转】C#中enum的总结
    发个服务端包裹返回值的Response类和用法
    微软企业库 Microsoft Enterprise Library
  • 原文地址:https://www.cnblogs.com/huihuizhang/p/11672409.html
Copyright © 2020-2023  润新知