官方文档(极简版授权):https://opendocs.alipay.com/open/218/wy75xo

Android

主要方法:uni端用plugin调用android方法,安卓调取原生授权,用了极简版授权,uni官方原生库中包含所需要的sdk。完全不冲突,自己使用,建议封装为插件导入形式;
好 处:是回调不需要像H5app授权那样还得监听onshow,用户不点网页返回,直接回不来;
坏 处:需要双端原生分别接入,对于不会原生的uni开发者来说,受罪;
版本:Hb.x-3.1.18 as-4.2.2

新建java类ElitetycPluginTest.java,app_id为支付宝分配app_id,我这里记录在服务器,uni端获取,然后在传过来;
这里需要注意一点,scheme必须和AndroidManifest 中 <AlipayResultActivity> 的 android:scheme一致,否则回不来了,其他不用修改;
代码如下

package com.lst;
import io.dcloud.common.DHInterface.IWebview;
import io.dcloud.common.DHInterface.StandardFeature;
import io.dcloud.common.util.JSUtil;
import org.json.JSONArray;
import java.util.Map;
import java.util.HashMap;
import android.os.Bundle;
import android.util.Log;
import com.alipay.sdk.app.OpenAuthTask;

public class ElitetycPluginTest extends StandardFeature {

    String TAG = "openAuthScheme";
    /**
     * 定义一个方法
     *
     * @param pWebview
     * @param array
     */
    public void openAuthScheme(IWebview pWebview, JSONArray array) {
        // 获取回调ID
        String CallBackID = array.optString(0);//plus.bridge.exec过来的第一个参数
        String app_id = array.optString(1);

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

        // 支付宝回跳到你的应用时使用的 Intent Scheme。请设置为不和其它应用冲突的值。
        // 如果不设置,将无法使用 H5 中间页的方法(OpenAuthTask.execute() 的最后一个参数)回跳至
        // 你的应用。
        //
        // 参见 AndroidManifest 中 <AlipayResultActivity> 的 android:scheme,此两处
        // 必须设置为相同的值。
        final String scheme = "__lsalipaysdk__";

        // 唤起授权业务
        final OpenAuthTask task = new OpenAuthTask(pWebview.getActivity());
        task.execute(
                scheme, // Intent Scheme
                OpenAuthTask.BizType.AccountAuth, // 业务类型
                bizParams,
                new OpenAuthTask.Callback() {
                    @Override
                    public void onResult(int i, String s, Bundle bundle) {
                        String _srccall = i + "";
                        if (i == OpenAuthTask.OK){
                            _srccall = bundle.getString( "auth_code" );
                        }
                        JSUtil.execCallback(pWebview, CallBackID, _srccall, JSUtil.OK, false);
                    }
                }, // 业务结果回调
                false); // 是否需要在用户未安装支付宝 App 时,使用 H5 中间页中转
    }
}

然后需要注册这类方法,不然uni找不到
dcloud_properties.xml文件<features>下加入如下代码,name方法名

<feature name="elitetyc" value="com.lst.ElitetycPluginTest"/>

AndroidManifest修改,加入如下代码,没啥好说的,官网copy,只需注意android:scheme和上面说的scheme一致;


        <!-- 为了使用 "通用跳转 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="__lsalipaysdk__"/>
            </intent-filter>
        </activity>

以上是JAVA全部代码

uniapp
新建js脚本plugin.js

! function(root, factory) {  
if (typeof exports == 'object' && typeof module != 'undefined') {  
    module.exports = factory()  
} else if (typeof define == 'function' && define.amd) {  
    define(factory)  
} else {  
    document.addEventListener('plusready', function(){  
    var moduleName = 'elitetyc';   //插件命名需与dcloud_properties.xml中一致
    
    root.plus[moduleName] = factory()  
    },false);  
}  
}(this, function() {  
var _BARCODE = 'elitetyc';  
var plugintest = {
    /**
     * @param string appid 支付宝appid
     * @param successCallback 成功回调
     * @param errorCallback  失败回调
     */
    openAuthScheme: function(appid,successCallback, errorCallback) {
        var success = typeof successCallback !== 'function' ? null : function(args) {
                successCallback(args);
            },
            fail = typeof errorCallback !== 'function' ? null : function(code) {
                errorCallback(code);
            };
        var callbackID = plus.bridge.callbackId(success, fail);
        return plus.bridge.exec(_BARCODE, "openAuthScheme", [callbackID,appid]);
    }
};  
return plugintest;  
});  

然后需要的地方引用


<script>
    var _this;
    import {mapState} from 'vuex';
    var elitetyc = require('../../common/plugin.js');
    export default {
        computed: {
            ...mapState({
                serverInfo: state => state.app.serverInfo,//服务端配置
            })
        },
        data() {
            return {
                auth_code:''
            };
        },
        /**
         * 生命周期函数--监听页面加载
         */
        onLoad: function(options) {
            _this = this;
        },
        methods: {
            // <a href="https://xiaowo6.cn/t/支付宝授权.html" >支付宝授权</a>
            openAuthScheme(){
                var appid = _this.serverInfo.app_id; //支付宝appid
                _this.plugins.openAuthScheme(
                    appid,
                    function(result) {
                        if (!result) {
                            return _this.showError('数据为空');
                        }else if (result == '5000') {
                            return _this.showError('多次调用,稍后重试!');
                        }else if(result == '4001'){
                            return _this.showError('未安装支付宝');
                        }else if(result == '4000'){
                            return _this.showError('其它错误,如参数传递错误');
                        }
                        _this.auth_code = result;//这里拿到code,交给服务器换信息
                    },
                    function(result) {
                    }
                );
            },
        }
    }
</script>

点赞(0)

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

返回
顶部