-
Notifications
You must be signed in to change notification settings - Fork 28
开放事件
- 认证事件(AbsAuthEvent)
- 文件选择事件(AbsChooserEvent)
- 分享事件(AbsShareEvent)
- 页面状态事件(AbsStateEvent)
- 用户添加商品到购物车相关事件(AbsAddToCartEvent)
- 购物车页面点击“结算”时回调事件(AbsAddUpEvent)
- 商品详情页面点击“立即购买”事件(AbsBuyNowEvent)
- 支付完成回到结果页,结果页收到支付成功回调(AbsPaymentFinishedEvent)
- 一键登陆成功回调(AbsAuthorizationSuccessEvent)
- 一键登陆失败回调(AbsAuthorizationErrorEvent)
- 账号注销成功回调(AbsAccountCancelSuccessEvent)
- 账号注销失败回调(AbsAccountCancelFailEvent)
- 通用自定义AbsCustomEvent
- 订单创建后回调
是否必须实现: 是
代码实践(伪代码):
final static int REQUEST_CODE_LOGIN= 0x11;
mView.subscribe(new AbsAuthEvent() {
/**
* @param needLogin 标识当需要的认证信息类型.
* needLogin为true: 需要带有用户角色的认证信息(即Cookie), 可以通过请求有赞服务端的登录(login)接口获取;
* needLogin为false: 无需用户角色的认证信息(即无需Cookie,只需要token), 既可通过初始化(initToken)接口获取也可通过登录(login)接口获取认证信息.
*/
@Override
public void call(Context context, boolean needLogin) {
//伪代码
if(AppUserManager.isLogin()){ //判断App内的用户是否登录
//调用login接口, 获取数据, 组装成YouzanToken, 回传给SDK
YouzanToken token = new YouzanToken()
token.setAccessToken("接口返回的access_token")
token.setCookieKey("接口返回的cookie_key")
token.setCookieValue("接口返回的cookie_value")
// 这里注意调用顺序。先传递给sdk,再刷新view
YouzanSDK.sync(getApplicationContext(), token);
mView.sync(token);
} else if (needLogin){
Intent intent = new Intent(YouzanActivity.this, LoginActivity.class);
startActivityForResult(intent, REQUEST_CODE_LOGIN);
} else {
//调用initToken接口, 获取数据, 组装成YouzanToken, 回传给 YouzanSDK
}
}
});
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK){
if(requestCode == REQUEST_CODE_LOGIN){
// 这里使用登录接口返回的数据,组装成YouzanToken,然后传回SDK
YouzanToken token = new YouzanToken()
token.setAccessToken("接口返回的access_token")
token.setCookieKey("接口返回的cookie_key")
token.setCookieValue("接口返回的cookie_value")
// 这里注意调用顺序。先传递给sdk,再刷新view
YouzanSDK.sync(getApplicationContext(), token);
mView.sync(token);
}
}
}
说明:
认证是SDK接入流程中最为重要的部分, 也是最复杂部分, 希望开发者能仔细浏览文档.
当访问的页面需要新的认证信息时(之前未认证过或者认证信息过期), 该事件会被回调.
开发者需按照代码实践中的建议实现编码(制作参考根据实际情况调整), 从服务端获取到认证信息后拼装成YouzanToken
对象后调用sync()方法回传给SDK来完成整个操作.
其中, YouzanToken
的数据模型:
字段 | 说明 |
---|---|
accessToken | 有赞服务端返回的access_token 字段, 用于网络接口认证 |
cookieKey | 有赞服务端返回的cookie_key 字段, 用于网页内认证 |
cookieValue | 有赞服务端返回的cookie_value 字段, 用于网页内认证 |
触发方式:
SDK内部触发.
是否必须实现: 否
代码实践:
mView.subscribe(new AbsChooserEvent() {
@Override
public void call(View view, Intent intent, int requestCode) throws ActivityNotFoundException {
startActivityForResult(intent, requestCode);
}
});
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK){
//...
mView.receiveFile(requestCode, data);
}
}
说明:
事件被回调表示SDK内发起了一个文件选择的请求, 之后开发者需要调用receiveFile()方法回传数据.
触发方式:
如果页面内有文件的选框, 点击选框触发.
是否必须实现: 否
代码实践:
mView.subscribe(new AbsShareEvent() {
@Override
public void call(View view, GoodsShareModel data) {
//调用系统默认的分享
String content = data.getDesc() + " " + data.getLink();
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, content);
sendIntent.putExtra(Intent.EXTRA_SUBJECT, data.getTitle());
sendIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
sendIntent.setType("text/plain");
startActivity(sendIntent);
}
});
说明:
事件被回调后, 可获取到GoodsShareModel
页面分享信息实例.
开发者可以调用Android系统默认的分享进行分享, 或者使用其他分享SDK来提高分享体验.
GoodsShareModel
包含的字段有:
字段 | 说明 |
---|---|
title | 页面标题 |
link | 当前页面链接 |
desc | 商品详细的描述 |
imgUrl | 商品图片链接 |
触发方式:
开发者可主动调用sharePage()方法触发.
最低实现版本: v6.4.0
是否必须实现: 否
代码实践:
mView.subscribe(new AbsAddToCartEvent() {
@Override
public void call(Context context, GoodsOfCartModel data) {
}
});
说明:
GoodsOfCartModel的数据格式为:
/**
* 商品id
*/
@SerializedName("item_id")
private long itemId;
/**
* 商品sku id
*/
@SerializedName("sku_id")
private long skuId;
/**
* 商品别名
*/
private String alias;
/**
* 商品标题
*/
private String title;
/**
* 商品购买数量
*/
private int num;
/**
* 商品支付价格
*/
@SerializedName("pay_price")
private int payPrice;
触发方式:
- 商品详情页面点击“加入购物车”
- 微页面点击购物车按钮加购
最低实现版本: v6.4.0
是否必须实现: 否
代码实践:
mView.subscribe(new AbsAddUpEvent() {
@Override
public void call(Context context, List<GoodsOfSettleModel> datas) {
}
});
说明:
GoodsOfSettleModel的数据格式为:
/**
* 商品id
*/
@SerializedName("item_id")
private long itemId;
/**
* 商品sku id
*/
@SerializedName("sku_id")
private long skuId;
/**
* 商品别名
*/
private String alias;
/**
* 商品标题
*/
private String title;
/**
* 商品购买数量
*/
private int num;
/**
* 商品支付价格
*/
@SerializedName("pay_price")
private int payPrice;
/**
* 是否被选中
*/
private boolean selected;
触发方式: 购物车页面点击“结算”时回调购物车内的商品信息(有无选择结算的都给回调,有是否选择的标识)
最低实现版本: v6.4.0
是否必须实现: 否
代码实践:
mView.subscribe(new AbsBuyNowEvent() {
@Override
public void call(Context context, GoodsOfCartModel data) {
}
});
说明:
GoodsOfSettleModel的数据格式为见添加到购物车事件
触发方式:
商品详情页面点击“立即购买”
最低实现版本: v6.4.0
是否必须实现: 否
代码实践:
mView.subscribe(new AbsPaymentFinishedEvent() {
@Override
public void call(Context context, TradePayFinishedModel data) {
}
});
说明:
TradePayFinishedModel的数据格式为:
/**
* 订单号
*/
private String tid;
/**
* 订单状态(1:成功)目前只有成功,支付超时无法确定
*/
private int status;
/**
* 支付方式 枚举值如下
* <p>
* (1. 微信支付
* <p>
* 2. 支付宝支付
* <p>
* 3. 储蓄卡支付
* <p>
* 4. 信用卡支付
* <p>
* 5. 储值支付(包括E卡)
* <p>
* 6. 找人代付)
*/
@SerializedName("pay_type")
private int payType;
触发方式:
支付完成回到结果页,结果页收到支付成功回调时
最低实现版本: basic:v7.1.12 , x5:v7.1.16
是否必须实现: 否
代码实践:
mView.subscribe(new AbsAuthorizationSuccessEvent() {
@Override
public void call(Context context) {
// 处理自己逻辑
}
});
触发方式:
一键登陆成功后前端调用JS方法,出发回调
最低实现版本: basic:v7.1.12 , x5:v7.1.16
是否必须实现: 否
代码实践:
mView.subscribe(new AbsAuthorizationErrorEvent() {
@Override
public void call(Context context,int code,String message) {
// 处理自己逻辑
//code 错误标示
//message 错误信息
}
});
触发方式:
一键登陆失败后前端调用JS方法,出发回调
最低实现版本: basic:v7.4.0 , x5:v7.4.0
是否必须实现: 否
代码实践:
mView.subscribe(new AbsAccountCancelSuccessEvent(client) {
@Override
public void call(Context context) {
// 处理自己逻辑
}
});
触发方式:
账号注销成功后,出发回调
最低实现版本: basic:v7.4.0 , x5:v7.4.0
是否必须实现: 否
代码实践:
mView.subscribe(new AbsAccountCancelFailEvent(client) {
@Override
public void call(Context context) {
// 处理自己逻辑
}
});
触发方式:
账号注销失败后,出发回调
事件名: customAction
client.subscribe(new AbsCustomEvent(){
@Override
public void callAction(@NotNull Context context, @NotNull String action, @NotNull String data) {
switch (action){
case "openHome":
try {
JSONObject jsonObject=new JSONObject(data);
JSONObject paramObj=jsonObject.optJSONObject("params");
String result=paramObj.optString("test");
Toast.makeText(YouzanActivity.this,"test:"+result,Toast.LENGTH_LONG).show();
} catch (JSONException e) {
throw new RuntimeException(e);
}
break;
}
Log.i(YouzanActivity.TAG, "收到AbsCustomEvent事件:"+data);
}
});
youzanBrowser.subscribe(new AbsAfterCreateOrderEvent() {
// data: 数据体
@Override
public void call(Context context, String data) {
Toast.makeText(context, data, Toast.LENGTH_SHORT).show();
}
});
数据格式
{
"action": "afterCreateOrder", // 与APP通信的actionType
"orderNo": "E20230828190226044400013", // 订单号
"orderFinalPrice": "0.00", // 订单最终支付金额
"goodsList": [ // 商品列表
{
"goodsId": 970129100, // 商品ID
"itemId": 100000, // 商品级 itemId
"alias": "26yz19d3tvesy", // 商品别名
"skuId": 37345205, // SKU ID
"title": "尼莫的0.01商品(勿动勿动勿动勿动勿动勿动勿动勿动🙏🏻)", // 商品名称
"num": 1, // 商品数量
"isPresent": false, // 是否为赠品
"goodsType": "normal" // 商品类型 normal = 实物商品; virtual = 普通虚拟商品; ecard = 电子卡券商品
}
]
}