Skip to content

开放事件

zhaohengyu edited this page Jul 16, 2018 · 23 revisions

认证事件(AbsAuthEvent)

是否必须实现: 是

代码实践(伪代码):

final static int REQUEST_CODE_LOGIN= 0x11;

mView.subscribe(new AbsAuthEvent() {
	/**
	* @param needLogin 标识当需要的认证信息类型.
	* needLogin为true: 需要带有用户角色的认证信息, 可以通过请求有赞服务端的登录(login)接口获取;
	* needLogin为false: 无需用户角色的认证信息, 既可通过初始化(initToken)接口获取也可通过登录(login)接口获取认证信息.
 	*/
	@Override
	public void call(View view, boolean needLogin) {
		//伪代码
		if(AppUserManager.isLogin()){ //判断App内的用户是否登录
			//调用login接口, 获取数据, 组装成YouzanToken, 回传给 mView.sync()
		} else if (needLogin){
			Intent intent = new Intent(YouzanActivity.this, LoginActivity.class);
			startActivityForResult(intent, REQUEST_CODE_LOGIN);
		} else {
			//调用initToken接口, 获取数据, 组装成YouzanToken, 回传给 mView.sync()
		}
	}
});

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
	super.onActivityResult(requestCode, resultCode, data);
	if(resultCode == RESULT_OK){
		if(requestCode == REQUEST_CODE_LOGIN){
			//调用login接口, 获取数据, 组装成YouzanToken, 回传给 mView.sync()
          	//若未登录,则回调:
            //if (!mView.syncNot()) {
            //	 onBackpressed();
            //}
        }
		}
		//处理文件选择
		mView.receiveFile(requestCode, data);
	}
}

说明:

认证是SDK接入流程中最为重要的部分, 也是最复杂部分, 希望开发者能仔细浏览文档.

当访问的页面需要新的认证信息时(之前未认证过或者认证信息过期), 该事件会被回调.

开发者需按照代码实践中的建议实现编码(制作参考根据实际情况调整), 从服务端获取到认证信息后拼装成YouzanToken对象后调用sync()方法回传给SDK来完成整个操作.

其中, YouzanToken的数据模型:

字段 说明
accessToken 有赞服务端返回的access_token 字段, 用于网络接口认证
cookieKey 有赞服务端返回的cookie_key 字段, 用于网页内认证
cookieValue 有赞服务端返回的cookie_value 字段, 用于网页内认证

初始化token接口

登录接口

触发方式:

SDK内部触发.

文件选择事件(AbsChooserEvent)

是否必须实现: 否

代码实践:

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()方法回传数据.

触发方式:

如果页面内有文件的选框, 点击选框触发.

分享事件(AbsShareEvent)

是否必须实现: 否

代码实践:

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()方法触发.

页面状态事件(AbsStateEvent)

是否必须实现: 否

代码实践:

mView.subscribe(new AbsStateEvent() {
    @Override
    public void call(View view) {
        //mActionBar.setTitle(mView.getTitle());
    }
});

说明:

事件被回调表示页面加载完成. 开发者可以基于这个时机获取页面标题等.

触发方式:

SDK内部触发.

用户添加商品到购物车相关事件(AbsAddToCartEvent)

最低实现版本: 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;

触发方式:

  1. 商品详情页面点击“加入购物车”
  2. 微页面点击购物车按钮加购

购物车页面点击“结算”时回调事件(AbsAddUpEvent)

最低实现版本: 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;

触发方式: 购物车页面点击“结算”时回调购物车内的商品信息(有无选择结算的都给回调,有是否选择的标识)

商品详情页面点击“立即购买”事件(AbsBuyNowEvent)

最低实现版本: v6.4.0

是否必须实现: 否

代码实践:

mView.subscribe(new AbsBuyNowEvent() {
    @Override
    public void call(Context context, GoodsOfCartModel data) {
        
    }
});

说明:

GoodsOfSettleModel的数据格式为见添加到购物车事件

触发方式:

商品详情页面点击“立即购买”

支付完成回到结果页,结果页收到支付成功回调(AbsPaymentFinishedEvent)

最低实现版本: 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;

触发方式:

支付完成回到结果页,结果页收到支付成功回调时