====== 环信红包接入文档 ====== ---- 新开商户可免费发送累计5000元总额的红包,超过5000元后,红包功能自动关闭,直到商户付费购买增值服务“红包功能”后,该功能重新开启,购买增值服务请咨询环信商务经理。 == 集成概述 == * 红包SDK分为两个版本,即钱包版红包SDK与支付宝版红包SDK。 * 使用钱包版红包SDK的用户,可以使用银行卡支付或支付宝支付等第三方支付来发红包;收到的红包金额会进入到钱包余额,并支持提现到绑定的银行卡。 * 使用支付宝版红包SDK的用户,发红包仅支持支付宝支付;收到的红包金额即时入账至绑定的支付宝账号。 * 请选择希望接入的版本并下载对应的SDK进行集成,钱包版红包SDK与支付宝版红包SDK集成方式相同。 * 需要注意的是如果已经集成了钱包版红包SDK,暂不支持切换到支付宝版红包SDK(两个版本不支持互通)。 * 环信Demo中使用redPacketlibrary模块集成了红包SDK相关红能。 * [https://github.com/easemob/sdkdemoapp3.0_android/tree/sdk3.0 集成Demo] == redPacketlibrary介绍 == * redPacketlibrary是在环信Demo中集成红包功能的模块,开发者可参考该模块中的方法集成红包功能。建议开发者以模块的形式集成红包功能,便于项目的更新和维护。 ===== redpacketlibrary目录说明 ===== * libs :包含了集成红包功能所依赖的jar包。(红包使用了glide库做图片加载,由于已经依赖了easeui这里不重复添加) * res :包含了聊天页面中的资源文件(例如红包消息卡片,回执消息的UI等)。 * utils包 : 封装了收、发红包的相关方法。 * widget包:聊天界面中的红包消息、红包回执消息的ChatRow。(开发者可自定义红包消息及回执消息的UI) 注意: RedPacketUtil类中使用了环信SDK中相关方法,以及红包chatrow继承自EaseChatRow,redpacketlibrary依赖了easeui,如不使用上诉相关代码可不依赖easeui。 ===== 集成步骤 ===== * 以支付宝版红包SDK为例,修改com.hyphenate.redpacket:redpacket-alipay:1.1.2中的1.1.2为已发布的更高版本(例如1.1.3),同步之后即可完成红包SDK的更新。 ==== 1.添加对红包工程的依赖 ==== * ChatDemo的build.gradle中 //添加远程仓库地址 allprojects { repositories { jcenter() maven { url "https://raw.githubusercontent.com/HyphenateInc/Hyphenate-SDK-Android/master/repository" } } } dependencies { compile project(':redpacketlibrary') compile project(':EaseUI') compile fileTree(dir: 'libs', include: '*.jar', exclude: 'android-support-multidex.jar') } * ChatDemo的setting.gradle中 include ':EaseUI', ':redpacketlibrary' ==== 2.ChatDemo清单文件中注册红包相关组件 ====                       ==== 3.DemoApplication初始化红包上下文 ==== @Override public void onCreate() { super.onCreate(); //初始化红包SDK,开启日志输出开关 RedPacket.getInstance().initRedPacket(applicationContext, RPConstant.AUTH_METHOD_EASEMOB, new RPInitRedPacketCallback() { @Override public void initTokenData(RPValueCallback callback) { TokenData tokenData = new TokenData(); tokenData.imUserId = EMClient.getInstance().getCurrentUser(); //此处使用环信id代替了appUserId 开发者可传入App的appUserId tokenData.appUserId = EMClient.getInstance().getCurrentUser(); tokenData.imToken = EMClient.getInstance().getAccessToken(); //同步或异步获取TokenData 获取成功后回调onSuccess()方法 callback.onSuccess(tokenData); } @Override public RedPacketInfo initCurrentUserSync() { //这里需要同步设置当前用户id、昵称和头像url String fromAvatarUrl = ""; String fromNickname = EMClient.getInstance().getCurrentUser(); EaseUser easeUser = EaseUserUtils.getUserInfo(fromNickname); if (easeUser != null) { fromAvatarUrl = TextUtils.isEmpty(easeUser.getAvatar()) ? "none" : easeUser.getAvatar(); fromNickname = TextUtils.isEmpty(easeUser.getNick()) ? easeUser.getUsername() : easeUser.getNick(); } RedPacketInfo redPacketInfo = new RedPacketInfo(); redPacketInfo.fromUserId = EMClient.getInstance().getCurrentUser(); redPacketInfo.fromAvatarUrl = fromAvatarUrl; redPacketInfo.fromNickName = fromNickname; return redPacketInfo; } }); //打开Log开关 正式发布时请关闭 RedPacket.getInstance().setDebugMode(true); } ==== 4. 发红包 ==== === 进入发红包页面 === @Override public boolean onExtendMenuItemClick(int itemId, View view) { switch (itemId) { ... case ITEM_RED_PACKET://进入红包页面 //注意:不再支持原有的startActivityForResult进入红包相关页面 int itemType; if (chatType == EaseConstant.CHATTYPE_SINGLE) { itemType = RPConstant.RP_ITEM_TYPE_SINGLE; //小额随机红包 //itemType = RPConstant.RP_ITEM_TYPE_RANDOM; } else { itemType = RPConstant.RP_ITEM_TYPE_GROUP; } RedPacketUtil.startRedPacket(getActivity(), itemType, toChatUsername, new RPSendPacketCallback() { @Override public void onGenerateRedPacketId(String redPacketId) { } @Override public void onSendPacketSuccess(RedPacketInfo redPacketInfo) { //发送红包消息到聊天页面 sendMessage(RedPacketUtil.createRPMessage(getActivity(), redPacketInfo, toChatUsername)); } }); break; } //不覆盖已有的点击事件 return false; } === 进入转账页面(仅支持钱包版) === RedPacketUtil.startRedPacket(getActivity(), RPConstant.RP_ITEM_TYPE_TRANSFER, toChatUsername, new RPSendPacketCallback() { @Override public void onGenerateRedPacketId(String redPacketId) { } @Override public void onSendPacketSuccess(RedPacketInfo redPacketInfo) { sendMessage(RedPacketUtil.createTRMessage(getActivity(), redPacketInfo, toChatUsername)); } }); ==== 5.拆红包 ==== === 拆单聊、群聊、小额随机红包的方法 === 调用示例 @Override public boolean onMessageBubbleClick(EMMessage message) { //消息框点击事件,demo这里不做覆盖,如需覆盖,return true if (message.getBooleanAttribute(RPConstant.MESSAGE_ATTR_IS_RED_PACKET_MESSAGE, false)){ RedPacketUtil.openRedPacket(getActivity(), chatType, message, toChatUsername, messageList); return true; } return false; } === 拆转账红包方法(仅支持钱包版) === '''RPRedPacketUtil.getInstance().openTransferPacket(context, redPacketInfo)''' redPacketInfo传入参数 * redPacketAmount 转账金额 * transferTime 转账时间 * messageDirect 消息的方向 调用示例 RPRedPacketUtil.getInstance().openTransferPacket(context, redPacketInfo) ==== 6.群红包领取回执消息的处理 ==== === ChatFragment中的处理 === @Override public void onCmdMessageReceived(List messages) { for (EMMessage message : messages) { EMCmdMessageBody cmdMsgBody = (EMCmdMessageBody) message.getBody(); String action = cmdMsgBody.action();//获取自定义action if (action.equals(RPConstant.REFRESH_GROUP_RED_PACKET_ACTION)){ RedPacketUtils.receiveRedPacketAckMessage(message); messageList.refresh(); } } super.onCmdMessageReceived(messages); } === MainActivity中的处理 === @Override public void onCmdMessageReceived(List messages) { for (EMMessage message : messages) { EMCmdMessageBody cmdMsgBody = (EMCmdMessageBody) message.getBody(); String action = cmdMsgBody.action();//获取自定义action if (action.equals(RPConstant.REFRESH_GROUP_RED_PACKET_ACTION) ){ RedPacketUtils.receiveRedPacketAckMessage(message); } } refreshUIWithMessage(); } === 全局处理 === * DemoHelper中 @Override public void onCmdMessageReceived(List messages) { for (EMMessage message : messages) { //获取消息body EMCmdMessageBody cmdMsgBody = (EMCmdMessageBody) message.getBody(); final String action = cmdMsgBody.action();//获取自定义action if(!easeUI.hasForegroundActivies()){ if (action.equals(RPConstant.REFRESH_GROUP_RED_PACKET_ACTION)){ RedPacketUtils.receiveRedPacketAckMessage(message); broadcastManager.sendBroadcast(new Intent(RPConstant.REFRESH_GROUP_RED_PACKET_ACTION)); } } } } * MainActivity中 private void registerBroadcastReceiver() { broadcastManager = LocalBroadcastManager.getInstance(this); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Constant.ACTION_CONTACT_CHANAGED); intentFilter.addAction(Constant.ACTION_GROUP_CHANAGED); intentFilter.addAction(RPConstant.REFRESH_GROUP_RED_PACKET_ACTION); broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { ... if (action.equals(RPConstant.REFRESH_GROUP_RED_PACKET_ACTION)){ if (conversationListFragment != null){ conversationListFragment.refresh(); } } } }; broadcastManager.registerReceiver(broadcastReceiver, intentFilter); } * 会话列表中红包回执消息的处理 @Override protected void setUpView() { super.setUpView(); ... //red packet code : 红包回执消息在会话列表最后一条消息的展示 conversationListView.setConversationListHelper(new EaseConversationListHelper() { @Override public String onSetItemSecondaryText(EMMessage lastMessage) { if (lastMessage.getBooleanAttribute(RPConstant.MESSAGE_ATTR_IS_RED_PACKET_ACK_MESSAGE, false)) { String sendNick = lastMessage.getStringAttribute(RPConstant.EXTRA_RED_PACKET_SENDER_NAME, ""); String receiveNick = lastMessage.getStringAttribute(RPConstant.EXTRA_RED_PACKET_RECEIVER_NAME, ""); String msg; if (lastMessage.direct() == EMMessage.Direct.RECEIVE) { msg = String.format(getResources().getString(R.string.msg_someone_take_red_packet), receiveNick); } else { if (sendNick.equals(receiveNick)) { msg = getResources().getString(R.string.msg_take_red_packet); } else { msg = String.format(getResources().getString(R.string.msg_take_someone_red_packet), sendNick); } } return msg; } return null; } }); super.setUpView(); //end of red packet code } ==== 7.屏蔽红包消息的转发和撤回功能 ==== * ContextMenuActivity的onCreate方法 if (type == EMMessage.Type.TXT.ordinal()) { if(message.getBooleanAttribute(Constant.MESSAGE_ATTR_IS_VIDEO_CALL, false) || message.getBooleanAttribute(Constant.MESSAGE_ATTR_IS_VOICE_CALL, false) || //屏蔽红包消息的转发功能 message.getBooleanAttribute(RPConstant.MESSAGE_ATTR_IS_RED_PACKET_MESSAGE, false)){ setContentView(R.layout.em_context_menu_for_location); } } if (isChatroom //屏蔽红包消息的撤回功能 || message.getBooleanAttribute(RPConstant.MESSAGE_ATTR_IS_RED_PACKET_MESSAGE, false)) { View v = (View) findViewById(R.id.forward); if (v != null) { v.setVisibility(View.GONE); } } ==== 8.进入零钱页方法(仅支持钱包版) ==== '''RPRedPacketUtil.getInstance().startChangeActivity(context)''' * 获取零钱余额接口(仅支持钱包版) RPRedPacketUtil.getInstance().getChangeBalance(new RPValueCallback() { @Override public void onSuccess(String changeBalance) { } @Override public void onError(String errorCode, String errorMsg) { } }); ==== 9.进入红包记录页面方法(仅支持支付宝版) ==== * RPRedPacketUtil.getInstance().startRecordActivity(context) == detachView接口 == * RPRedPacketUtil.getInstance().detachView() * 在拆红包方法所在页面销毁时调用,可防止内存泄漏。 * 调用示例(以ChatFragment为例) @Override public void onDestroy() { super.onDestroy(); RPRedPacketUtil.getInstance().detachView(); } ==== 10.拆红包音效 ==== * 在assets目录下添加open_packet_sound.mp3或者open_packet_sound.wav文件即可(文件大小不要超过1M)。 ---- 上一页:[[im:200androidclientintegration:95privatecloud|私有云SDK集成配置]] 下一页:[[im:200androidclientintegration:100iosnickname|设置当前登录用户的推送昵称]]