Skip to content

开放事件

pepperer edited this page Sep 1, 2023 · 23 revisions

认证事件(AbsAuthEvent)

是否必须实现: 是

代码实践(伪代码):

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 字段, 用于网页内认证

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

用户添加商品到购物车相关事件(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;

触发方式:

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

一键登陆成功回调(AbsAuthorizationSuccessEvent)

最低实现版本: basic:v7.1.12 , x5:v7.1.16

是否必须实现: 否

代码实践:

mView.subscribe(new AbsAuthorizationSuccessEvent() {
    @Override
    public void call(Context context) {
        // 处理自己逻辑
    }
});

触发方式:

一键登陆成功后前端调用JS方法,出发回调

一键登陆失败回调(AbsAuthorizationErrorEvent)

最低实现版本: 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方法,出发回调

账号注销成功回调(AbsAccountCancelSuccessEvent)

最低实现版本: basic:v7.4.0 , x5:v7.4.0

是否必须实现: 否

代码实践:

  mView.subscribe(new AbsAccountCancelSuccessEvent(client) {
            @Override
            public void call(Context context) {
                // 处理自己逻辑
            }
        });

触发方式:

账号注销成功后,出发回调

账号注销失败回调(AbsAccountCancelFailEvent)

最低实现版本: basic:v7.4.0 , x5:v7.4.0

是否必须实现: 否

代码实践:

  mView.subscribe(new AbsAccountCancelFailEvent(client) {
            @Override
            public void call(Context context) {
                // 处理自己逻辑
            }
        });

触发方式:

账号注销失败后,出发回调

通用自定义AbsCustomEvent

事件名: 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 = 电子卡券商品
    }
  ]
}