官方文档(极简版授权):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>