// 支付宝提现 支付宝授权 支付宝登录 2021年6月8日09:17:06

2021年6月9日11:28:57 发现问题;android 11 进入支付宝H5页面,点击打开支付宝,无法调用启动支付宝

官方文档:极简版 SDK 调用方法 – 支付宝开放平台

alipaysdk-15.8.03.210428205839.aar

// 支付宝 SDK AAR 包所需的配置
implementation (name: 'alipaysdk-15.8.03.210428205839', ext: 'aar')
<!-- 为了使用 "通用跳转 SDK" 的能力,需要在您的 App 的 AndroidManifest.xml 中添加这一项 -->
        <!-- 并合理设置 android:scheme 的值 -->
        <activity android:name="com.alipay.sdk.app.AlipayResultActivity" tools:node="merge">
            <intent-filter tools:node="replace">
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:scheme="__alipaysdkdemo__"/>
            </intent-filter>
        </activity>

    /**
     * 通用跳转授权业务 Demo
     */
    public void openAuthScheme(   ) {

        // 传递给支付宝应用的业务参数
        final Map<String, String> bizParams = new HashMap<>();
        bizParams.put("url", "https://authweb.alipay.com/auth?auth_type=PURE_OAUTH_SDK&app_id=202**************92&scope=auth_user&state=init");

        // 支付宝回跳到您的应用时使用的 Intent Scheme。
        // 请设置为一个不和其它应用冲突的值,并在 AndroidManifest.xml 中为 AlipayResultActivity 的 android:scheme 属性
        // 指定相同的值。实际使用时请勿设置为 __alipaysdkdemo__ 。
        // 如果不设置,OpenAuthTask.execute() 在用户未安装支付宝,使用网页完成业务流程后,将无法回跳至您的应用。
        final String scheme = "__alipaysdkdemo__";

        // 防止在支付宝 App 被强行退出等意外情况下,OpenAuthTask.Callback 一定时间内无法释放,导致
        // Activity 泄漏
        final WeakReference<Activity> ctxRef = new WeakReference<>(this);

        // 唤起授权业务
        final OpenAuthTask task = new OpenAuthTask(this);
        task.execute(
                scheme,    // Intent Scheme
                OpenAuthTask.BizType.AccountAuth, // 业务类型
                bizParams, // 业务参数
                new OpenAuthTask.Callback() {
                    @Override
                    public void onResult(int i, String s, Bundle bundle) {
                        final Context ref = ctxRef.get();
                        if (ref != null) {
//                            showAlert(ref, String.format("结果码: %s\n结果信息: %s\n结果数据: %s", i, s, bundleToString(bundle)));
                            Log.e("===========", String.format("结果码: %s\n结果信息: %s\n结果数据: %s", i, s, bundleToString(bundle)));
//                            结果数据:
//                            app_id=>202***********492
//                            result_code=>SUCCESS
//                            scope=>auth_user
//                            state=>init
//                            auth_code=>4***451************fad7****
                        }
                    }
                }, // 业务结果回调
                true); // 是否需要在用户未安装支付宝 App 时,使用 H5 中间页中转。建议设置为 true。
    }

    private static String bundleToString(Bundle bundle) {
        if (bundle == null) {
            return "null";
        }
        final StringBuilder sb = new StringBuilder();
        for (String key : bundle.keySet()) {
            sb.append(key).append("=>").append(bundle.get(key)).append("\n");
        }
        return sb.toString();
    }
allprojects {
        maven { url 'https://jitpack.io' }
        maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
        maven { url 'https://dl.bintray.com/umsdk/release' }
        // 支付宝 SDK AAR 包所需的配置
        flatDir {
            dirs 'libs'
        }
    }
}

// recyclerView.setAdapter 外部类

工具类:RecyclerViewUtils

public class MainActivity extends AppCompatActivity {
    RecyclerView recyclerView;
    RecyclerView recyclerView1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        recyclerView = findViewById(R.id.recyclerView);
        recyclerView1 = findViewById(R.id.recyclerView1);
        initList(recyclerView, 10);
        initList(recyclerView1, 30);
    }

    private void initList(RecyclerView recyclerView, int size) {
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(new ZowneoAdapter(this).setSize(size));
    }
}
public class ZowneoAdapter extends RecyclerView.Adapter<ZowneoAdapter.Vh> {
    List<String> list = new ArrayList<>();
    Activity activity;
    int size;
    int[] resource;

    public ZowneoAdapter ZowneoAdapter(Activity activity, List<String> list) {
        this.activity = activity;
        this.list = list;
        return this;
    }

    /**
     * @param activity
     * @param resource 列表项
     */
    public ZowneoAdapter(Activity activity, int... resource) {
        this.activity = activity;
        this.resource = resource;
    }

    @NonNull
    @Override
    public Vh onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View inflate;
        if (resource.length == 0) {
            inflate = LayoutInflater.from(activity).inflate(R.layout.item_user_home_report, parent, false);
        } else {
            inflate = LayoutInflater.from(activity).inflate(resource[0], parent, false);
        }
        return new Vh(inflate);
    }

    @Override
    public void onBindViewHolder(@NonNull Vh vh, int position) {
        vh.setData(position);
    }

    public void setResource(int[] resource) {
        this.resource = resource;
        notifyDataSetChanged();
    }

    public void setList(List<String> list) {
        this.list = list;
        notifyDataSetChanged();
    }

    public ZowneoAdapter setSize(int size) {
        this.size = size;
        notifyDataSetChanged();
        return this;
    }


    @Override
    public int getItemCount() {
        if (size == 0) {
            return list.size();
        } else {
            return size;
        }
    }

    static class Vh extends RecyclerView.ViewHolder {
        TextView word_tv;

        public Vh(View itemView) {
            super(itemView);
            word_tv = itemView.findViewById(R.id.word_tv);
        }

        void setData(final int position) {
        }

    }
}

item_user_home_report.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/word_tv"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:textSize="12sp"
        android:background="@android:color/holo_blue_light"
        android:paddingHorizontal="10dp"
        android:paddingVertical="5dp"
        android:textColor="#666666" />

    <View
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:background="#F5F5F5"
        android:visibility="visible" />
</LinearLayout>

// recyclerView.setAdapter 内部类

RecyclerView recyclerView;
    RecyclerView recyclerView1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        recyclerView = findViewById(R.id.recyclerView);
        recyclerView1 = findViewById(R.id.recyclerView1);
        initList(recyclerView, 10);
        initList(recyclerView1, 100);
        initList(recyclerView1, 8);
    }


    RecyclerView.Adapter adapter;
    private void initList(RecyclerView recyclerView, final int size) {
    private void initList(RecyclerView recyclerView, int size) {
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        adapter = new RecyclerView.Adapter<Vh>() {
            @NonNull
            @Override
            public Vh onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
                View inflate = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_user_home_report, viewGroup, false);
                return new Vh(inflate);
            }

            @Override
            public void onBindViewHolder(@NonNull Vh vh, int i) {
                vh.setData(i  );
            }

            @Override
            public int getItemCount() {
                return size;
            }
        };
        ZowneoAdapter adapter = new ZowneoAdapter(this, size);
        recyclerView.setAdapter(adapter);
    }


    static class Vh extends RecyclerView.ViewHolder {
        TextView word_tv;

        public Vh(View itemView) {
            super(itemView);
            word_tv = itemView.findViewById(R.id.word_tv);
        }

        void setData(final int position ) {
        }

    }

// webview加载富文本

    public static void setH5Data(WebView webView, String h5_Str) {
        StringBuffer stringBuffer=new StringBuffer();
        stringBuffer.append("<!DOCTYPE html>\n" +
                "<html>\n" +
                "  <head>\n" +
                "    <meta charset=\"utf-8\">\n" +
                "    <meta name=\"viewport\" content=\"width=device-width,initial-scale=1,user-scalable=0\">\n" +
                "    <title></title>\n" +
                "  </head>\n" +
                "  <body>\n");
        stringBuffer.append(h5_Str);
        stringBuffer.append("</body></html>");
        //        h5_Str="<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,user-scalable=0\">";
        h5_Str=stringBuffer.toString();
        h5_Str = h5_Str.replace("<img", "<img style=\"display:block;\" width=\"100%\"")
                .replace("<p", "<p style=\"margin:0\"");
        webView.loadDataWithBaseURL(null, h5_Str,"text/html", "utf-8", null);
    }

// 获取手机型号 // 获取手机系统版本号 获取版本号

android.os.Build.MODEL;//手机型号
android.os.Build.VERSION.RELEASE;//手机系统版本号
/**
 * 获取版本号
 */
public static String getVersion() {
    if (TextUtils.isEmpty(sVersion)) {
        try {
            PackageManager manager = CommonAppContext.sInstance.getPackageManager();
            PackageInfo info = manager.getPackageInfo(CommonAppContext.sInstance.getPackageName(), 0);
            sVersion = info.versionName;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return sVersion;
}

// get提交和post提交的区别:

GET方式: 将表单数据,以”name=value”形式追加到action指定的处理程序的后面,两者间用”?”隔开,每一个表单的”name=value”间用”&”号隔开。 特点:只适合提交少量信息,并且不太安全(不要提交敏感数据)、提交的数据类型只限于ASCII字符。

POST方式: 将表单数据直接发送(隐藏)到action指定的处理程序。POST发送的数据不可见。Action指定的处理程序可以获取到表单数据。 特点:可以提交海量信息,相对来说安全一些,提交的数据格式是多样的(Word、Excel、rar、img)。

作者 wanglei

发表评论