友盟社会化Android组件之第三方登录

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

前段时间公司需要,逐步了新浪微博、腾讯qq、微信等授权登录验证的问题。如果要一个个申请,看文档写代码也是很多流程的。干脆用友盟社会化Android组件之第三方登录。友盟是集成了这些平台,还有其他主流的平台的。我在这里主要讲一下友盟里面微博登录。先看看友盟是怎么介绍自已的。

一、友盟社会化分享介绍

友盟社会化分享组件,帮助移动应用快速具备微信分享,微博分享、登录、评论、喜欢等社会化组件功能,助力产品推广,并提供实时、全面的社会化数据统计分析服务,是国内最大的社会化分享SDK。

支持各大社交平台

精选国内外23个主流社交平台,支持图片、文字、图文、音乐、视频等多种内容的分享。

国内平台:微信、朋友圈、QQ、Qzone、新浪微博、腾讯微博、人人、豆瓣、有道云笔记、来往、易信、短信、邮件

国外平台:Facebook、Twitter、Instagram、Google+、Line、Whatsapp、Tumblr、Pinterest、Evernote、Pocket、LIinkedIn、Flickr、Kakao Talk。

从这上面可以看出,支持平台太多啦,自已有选择开发就行。搞几个申请、注册、身份认证、应用审核。。。你都会抓狂的。。


二、友盟开发

1、注册友盟的开放平台的网址:http://www.umeng.com/
   友盟的注册很简单,有个邮箱就能注册,注册完不用身份认证那么麻烦。不用审核等。

2、友盟官方第三方文档支持:
    http://dev.umeng.com/social/android/operation
    http://dev.umeng.com/social/android/login-page


三、友盟平台里面新浪微博操作

1、注册新浪微博开放的网址:http://open.weibo.com/

   这个开放平台的注册,一定要有开通微博账号的账户。用个人或者企业级的。
   开通之后,先进行邮箱验证:选择个人或者企业。需要一系列的资料。
   身份验证:个人和企业认证有区别。也是一系列的资料。

   搞定这些了,创建移动应用了。需要的资料很多,我在这里列出几个重点的:
   应用的包名:
   应用的签名:
   android应用的下载地址:(一定是应用商店上线后的地址:例如,百度、91、安卓等,我是有百度开发者平台上线应用的)
   应用介绍:
   应用图标:三个(分别是16*16、80*80、120*120 单位px)
   应用介绍图片:三张以上(300*450 单位px)

   ps:有这些资料就差不多了,图片尺寸以及应用下载地址严格按照要求。个人开发一般人还真弄不了那么多。
       提交需要审核,最好在应用展示图片中有用到分享到微博的例子,容易通过。审核时间一天以内。

2、App Key以及App Secret配置到友盟平台

   这上面搞定了之后,把上面申请到的App Key以及App Secret配置到友盟平台。如下图:
   新浪微博的配置不用在代码中配置,只需要在友盟的后台。微信,qq需要在代码中配置。



3、新浪微博第三方登录代码的流程

这个流程在友盟文档中也有很详细,我就不写友盟那里文档的东西了。写了就有重复。就看看我的代码吧。不过我代码中还有qq,微信都在了。将就着看,感觉都还好理解。我只贴授权登录的了,分享、评论那些我删了。

<span style="font-size:18px;">package com.southgnss.umeng;

import java.io.File;
import java.util.Date;
import java.util.Map;

import android.app.Activity;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

import com.southgnss.umeng.commons.Constants;
import com.umeng.analytics.MobclickAgent;
import com.umeng.socialize.bean.SHARE_MEDIA;
import com.umeng.socialize.bean.SocializeEntity;
import com.umeng.socialize.bean.StatusCode;
import com.umeng.socialize.controller.UMServiceFactory;
import com.umeng.socialize.controller.UMSocialService;
import com.umeng.socialize.controller.listener.SocializeListeners.SocializeClientListener;
import com.umeng.socialize.controller.listener.SocializeListeners.UMAuthListener;
import com.umeng.socialize.controller.listener.SocializeListeners.UMDataListener;
import com.umeng.socialize.exception.SocializeException;
import com.umeng.socialize.sso.QZoneSsoHandler;
import com.umeng.socialize.sso.SinaSsoHandler;
import com.umeng.socialize.sso.UMQQSsoHandler;
import com.umeng.socialize.sso.UMSsoHandler;
import com.umeng.socialize.utils.Log;
import com.umeng.socialize.weixin.controller.UMWXHandler;

/**
 * @description 实现友盟第三方登录注销、获取用户信息
 */
public class LoginActivity extends Activity implements OnClickListener {
	// 整个平台的Controller,负责管理整个SDK的配置、操作等处理
	private UMSocialService mController = UMServiceFactory
			.getUMSocialService(Constants.DESCRIPTOR);

	private Button sinaLoginButton;
	private Button sinaLogoutButton;
	private Button qqLoginButton;
	private Button qqLogoutButton;
	private Button wechatLoginButton;
	private Button wechatLogoutButton;
	private Button shareButton;

	@SuppressWarnings("deprecation")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		sinaLoginButton = (Button) this.findViewById(R.id.btn_sina_login);
		sinaLogoutButton = (Button) this.findViewById(R.id.btn_sina_logout);
		qqLoginButton = (Button) this.findViewById(R.id.btn_qq_login);
		qqLogoutButton = (Button) this.findViewById(R.id.btn_qq_logout);
		shareButton = (Button) this.findViewById(R.id.btn_share);
		wechatLoginButton = (Button) this.findViewById(R.id.btn_wechat_login);
		wechatLogoutButton = (Button) this.findViewById(R.id.btn_wechat_logout);
		
		sinaLoginButton.setOnClickListener(this);
		sinaLogoutButton.setOnClickListener(this);
		qqLoginButton.setOnClickListener(this);
		qqLogoutButton.setOnClickListener(this);
		shareButton.setOnClickListener(this);
		wechatLoginButton.setOnClickListener(this);
		wechatLogoutButton.setOnClickListener(this);

		// 配置需要分享的相关平台
		configPlatforms();

		MobclickAgent.updateOnlineConfig(this);
	}
	
	@Override
	protected void onResume() {          
	    super.onResume();          
	    MobclickAgent.onResume(this);
	}        

	@Override
	protected void onPause() {      
	    super.onPause();      
	    MobclickAgent.onPause(this);
	}  

	/**
	 * 配置分享平台参数
	 */
	private void configPlatforms() {
		// 添加新浪sso授权
		mController.getConfig().setSsoHandler(new SinaSsoHandler());

		// 添加QQ、QZone平台
		addQQQZonePlatform();

		// 添加微信、微信朋友圈平台
		addWXPlatform();

	}


	/**
	 * 添加所有的平台</br>
	 */
	private void addCustomPlatforms() {
		// 添加微信平台
		addWXPlatform();
		// 添加QQ平台
		addQQQZonePlatform();
		
		mController.getConfig().setPlatforms(SHARE_MEDIA.WEIXIN,
				SHARE_MEDIA.WEIXIN_CIRCLE, SHARE_MEDIA.QQ, SHARE_MEDIA.QZONE,
				SHARE_MEDIA.SINA, SHARE_MEDIA.TENCENT);
		mController.openShare(LoginActivity.this, false);
	}

	/**
	 * @功能描述 : 添加微信平台分享
	 * @return
	 */
	private void addWXPlatform() {
		// 注意:在微信授权的时候,必须传递appSecret
		// wx967daebe835fbeac是你在微信开发平台注册应用的AppID, 这里需要替换成你注册的AppID
		String appId = "wxc8f10d692edf9f5f";
		String appSecret = "d4624c36b6795d1d99dcf0547af5443d";
		// 添加微信平台
		UMWXHandler wxHandler = new UMWXHandler(LoginActivity.this, appId,
				appSecret);
		wxHandler.addToSocialSDK();

		// 支持微信朋友圈
//		UMWXHandler wxCircleHandler = new UMWXHandler(LoginActivity.this,
//				appId, appSecret);
//		wxCircleHandler.setToCircle(true);
//		wxCircleHandler.addToSocialSDK();
	}

	/**
	 * @功能描述 : 添加QQ平台支持 QQ分享的内容, 包含四种类型, 即单纯的文字、图片、音乐、视频. 参数说明 : title, summary,
	 *       image url中必须至少设置一个, targetUrl必须设置,网页地址必须以"http://"开头 . title :
	 *       要分享标题 summary : 要分享的文字概述 image url : 图片地址 [以上三个参数至少填写一个] targetUrl
	 *       : 用户点击该分享时跳转到的目标地址 [必填] ( 若不填写则默认设置为友盟主页 )
	 * @return
	 */
	private void addQQQZonePlatform() {
		String appId = "100424468";
		String appKey = "c7394704798a158208a74ab60104f0ba";
		// 添加QQ支持, 并且设置QQ分享内容的target url
		UMQQSsoHandler qqSsoHandler = new UMQQSsoHandler(LoginActivity.this,
				appId, appKey);
//		qqSsoHandler.setTargetUrl("http://www.umeng.com");
//		qqSsoHandler.addToSocialSDK();

		// 添加QZone平台
		QZoneSsoHandler qZoneSsoHandler = new QZoneSsoHandler(
				LoginActivity.this, appId, appKey);
//		qZoneSsoHandler.addToSocialSDK();
	}


	@Override
	public void onClick(View v) {
		int nid = v.getId();
		if (nid == R.id.btn_sina_login) {
			login(SHARE_MEDIA.SINA);
			return;
		}else if (nid == R.id.btn_qq_login) {
			login(SHARE_MEDIA.QQ);
			return;
		}else if (nid == R.id.btn_wechat_login) {
			login(SHARE_MEDIA.WEIXIN);
			return;
		}else if (nid == R.id.btn_sina_logout) {
			logout(SHARE_MEDIA.SINA);
			return;
		}else if (nid == R.id.btn_qq_logout) {
			logout(SHARE_MEDIA.QQ);
			return;
		}else if (nid == R.id.btn_wechat_logout) {
			logout(SHARE_MEDIA.WEIXIN);
			return;
		}
	}

	/**
	 * 授权。如果授权成功,则获取用户信息
	 * 
	 * @param platform
	 */
	private void login(final SHARE_MEDIA platform) {
		mController.doOauthVerify(LoginActivity.this, platform,
				new UMAuthListener() {

					@Override
					public void onStart(SHARE_MEDIA platform) {
						Toast.makeText(LoginActivity.this, "授权开始",
								Toast.LENGTH_SHORT).show();
					}

					@Override
					public void onError(SocializeException e,
							SHARE_MEDIA platform) {
						Toast.makeText(LoginActivity.this, "授权失败",
								Toast.LENGTH_SHORT).show();
					}

					@Override
					public void onComplete(Bundle value, SHARE_MEDIA platform) {
						Toast.makeText(LoginActivity.this, "授权完成",
								Toast.LENGTH_LONG).show();
						// 获取uid
						String uid = value.getString("uid");
						if (!TextUtils.isEmpty(uid)) {
							// uid不为空,获取用户信息
							getUserInfo(platform);
						} else {
							Toast.makeText(LoginActivity.this, "授权失败...",
									Toast.LENGTH_LONG).show();
						}
					}

					@Override
					public void onCancel(SHARE_MEDIA platform) {
						Toast.makeText(LoginActivity.this, "授权取消",
								Toast.LENGTH_SHORT).show();
					}
				});
	}

	/**
	 * 获取用户信息
	 * 
	 * @param platform
	 */
	private void getUserInfo(SHARE_MEDIA platform) {
		mController.getPlatformInfo(LoginActivity.this, platform,
				new UMDataListener() {

					@Override
					public void onStart() {

					}

					@Override
					public void onComplete(int status, Map<String, Object> info) {
//						 String showText = "";
//						 if (status == StatusCode.ST_CODE_SUCCESSED) {
//						 showText = "用户名:" +
//						 info.get("screen_name").toString();
//						 Log.d("#########", "##########" + info.toString());
//						 } else {
//						 showText = "获取用户信息失败";
//						 }

						if (info != null) {
							Toast.makeText(LoginActivity.this, info.toString(),Toast.LENGTH_SHORT).show();
						}
					}
				});
	}
	
	/**
	 * 注销本次登陆
	 * @param platform
	 */
	private void logout(final SHARE_MEDIA platform) {
		mController.deleteOauth(LoginActivity.this, platform, new SocializeClientListener() {
			
			@Override
			public void onStart() {
				
			}
			
			@Override
			public void onComplete(int status, SocializeEntity entity) {
				String showText = "解除" + platform.toString() + "平台授权成功";
				if (status != StatusCode.ST_CODE_SUCCESSED) {
					showText = "解除" + platform.toString() + "平台授权失败[" + status + "]";
				}
				Toast.makeText(LoginActivity.this, showText, Toast.LENGTH_SHORT).show();
			}
		});
	}
	

	// 如果有使用任一平台的SSO授权, 则必须在对应的activity中实现onActivityResult方法, 并添加如下代码
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		// 根据requestCode获取对应的SsoHandler,返回一定是requestCode
		UMSsoHandler ssoHandler = mController.getConfig().getSsoHandler(requestCode);
		if (ssoHandler != null) {
			ssoHandler.authorizeCallBack(requestCode, resultCode, data);
		}
	}
}
</span>

这上面代码我在测试时候,微博是成功的。然后qq那个密钥不行,我注释掉了配置到平台的代码。微信那个审核最严格,没有App Key以及App Secret是行不通。我的那个还在微信那边审核,开通那个开发者身份资质认证需要300元的。一堆资料填写审核。。。

实现效果如下:

这张是微博授权界面



授权通过返回的数据:



最后一张是,我在友盟官网有选择性下载的一个demo的界面。那个友盟demo我也有源码,现在懂得怎样开发了。



四、开发过程中遇到的问题:

1、编译出现以下错误
[2015-11-27 15:05:23 - Dex Loader] Unable to execute dex: Multiple dex files define Lcom/sina/sso/RemoteSSO;
[2015-11-27 15:05:23 - SouthGnssServer] Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lcom/sina/sso/RemoteSSO;
出现这个是有重复的库,删掉一个就可以了。如下两张图的比较。

           


                 


一是没有集成到一个SocialSDK_Sina.jar里面,放在外面的包下面com.sina.sso,这个需要额外添加这个包下.aidl文件。包名还是这个com.sina.sso。不能变。
二是有集成SocialSDK_Sina.jar里面。这个不用再外面添加了。如有添加,就会出现编译错误。


2、带签名调试的问题,决办法如下:(我也是网上找的资料如下,个人觉得写的总结最清晰)

修改Android签名证书keystore的密码、别名alias以及别名密码

之前在测试Eclipse ADT的Custom debug keystore自定义调试证书的时候,发过一篇关于调试证书规格的博文:Eclipse ADT的Custom debug keystore所需证书规格,提到过自定义调试证书的密码和alias命名以及alias密码都是有规矩的。其实Android应用开发接入各种SDK时会发现,有很多SDK是需要靠package name和keystore的指纹hash来识别的(百度地图SDK、Facebook SDK等等…),这样如果使用默认自动生成的debug keystore的话就会给开发调试工作带来一些麻烦。这时可以通过修改正式的release keystore,生成一份“遵守规矩”的临时自定义调试证书给开发时用,就方便多了,具体方法如下:

1. 首先当然是先复制一份正式证书出来作为要修改为的临时调试证书。

2. 修改keystore密码的命令(keytool为JDK带的命令行工具):
keytool -storepasswd -keystore my.keystore
其中,my.keystore是复制出来的证书文件,执行后会提示输入证书的当前密码,和新密码以及重复新密码确认。这一步需要将密码改为android。

3. 修改keystore的alias:
keytool -changealias -keystore my.keystore -alias my_name -destalias androiddebugkey
这一步中,my_name是证书中当前的alias,-destalias指定的是要修改为的alias,这里按规矩来,改为androiddebugkey!这个命令会先后提示输入keystore的密码和当前alias的密码。

4. 修改alias的密码:
keytool -keypasswd -keystore my.keystore -alias androiddebugkey

这一步执行后会提示输入keystore密码,alias密码,然后提示输入新的alias密码,同样,按规矩来,改为android!

以上几个操作执行后,my.keystore就是符合规矩的debug keystore了,接着在Eclipse的ADT设置中选中这个custom debug keystore即可。


五、参考资料

我的写代码也有参考这个大神的发布的demo:

http://blog.csdn.net/wwj_748/article/details/41117173

友盟官方第三方文档支持:
http://dev.umeng.com/social/android/operation
http://dev.umeng.com/social/android/login-page


友盟论坛:友盟社会化分享集成问题索引

http://bbs.umeng.com/thread-5908-1-1.html?from=qianming



关注更多内容请关注新浪微博:925686749@qq.com

友盟社会化组件集成实战——实现微信、微博、QQ一键登录与内容分享 友盟社会化组件(UMeng Social SDK)是一套专为移动应用提供第三方登录、内容分享及用户行为分析的一体化解决方案。它通过统一接口封装微信、微博、QQ等主流社交平台的开放能力,显著降低开发者对接多平台的复杂度。该组件广泛应用于App拉新、提升用户留存与促进社交裂变等场景,尤其适用于需要快速构建社交生态的产品初期阶段。其核心优势在于平台兼容性强、API设计简洁,并深度集成友盟+统计分析体系,实现用户来源追踪与分享转化率可视化,为企业级运营决策提供数据支撑。 阅读详情

相关推荐

基于友盟的微博、微信、QQ第三方登录集成方案

平台凭证名称绑定依据回调要求审核周期微博包名 + 回调URLHTTPS + 备案1-3天微信包名 + SHA1授权域名白名单1-3天QQ互联包名 + MD5无HTTPS强制当日该表格可用于项目初期选型参考,结合团队资源与上线节奏做出最优决策。至此,三大平台的应用凭证获取与配置流程已全面展开。

weixin_31776191的博客 1640

Android 友盟社会化组件-分享实现,android基础图形

2. 注册SDK使用的Activity和权限、添加UmengAppkey 打开你的Menifest.xml文件,添加以下内容 <activity android:name=“com.umeng.socialize.view.ShareActivity” android:configChanges=“orientation|keyboard” android:launchMode=“singleTask” android:noHistory=“true” android:theme="@style/

m0_63737792的博客 316

STM32项目实战_基于STM32F103的智能药箱设计与实现(硬件详解+软件逻辑+调试要点)

本文详细介绍了基于STM32F103的智能药箱设计与实现,涵盖硬件设计、软件逻辑和调试要点。项目核心功能包括精准提醒、药品管理和远程监控,采用STM32单片机作为主控,结合光电开关、蓝牙模块等实现智能化管理。文章还分享了电路图设计、程序优化及常见问题解决方案,为嵌入式开发爱好者提供实用参考。

weixin_28717683的博客 275

谷歌帮:中国最牛的创业帮派

【导读】随着郭去疾的兰亭集势提交IPO申请,谷歌背景的创业者也逐渐浮出水面:创新工场创始人李开复、小米联合创始人林斌、友盟创始人蒋凡、木瓜移动创始人沈思、聚美优品联合创始人戴雨森、涂鸦移动创始人王晔…… 据统计,谷歌中国至少贡献了20个互联网公司的创始人或CEO,而其中不乏数亿美金甚至数十亿美金公司的缔造者。由此,谷歌中国也一度被人誉为中国互联网界的“黄埔军校”。 创新工场创始人——李开复 ...

系统运维 773

android-友盟第三方登录,及分享的使用

部分内容转载自 http://blog.csdn.net/wwj_748/article/details/41117173 本文介绍友盟包的使用,以 微信,QQ, 新浪 的第三方登录及分享为例 一. 首先要有个友盟的帐号  https://www.umeng.com 二.在友盟创建新应用 https://www.umeng.com/apps?interest=so

guige_csdn的专栏 5886

友盟第三方分享

1.  产品概述关于分享和授权的sdk接口,我们在v5.0做出了巨大的改变,精简了接口调用的代码。并将分享授权,与评论等功能做出了隔离,使结构更加清晰。所以本版本的功能也只有分享与授权并无其他功能,请开发者注意。注意:本文示例代码只有分享与授权功能,并对接口进行了调整,如需要原功能的开发者,请继续使用v4.3.0版本。 2.  获取友盟Appkey如果你之前已经在友盟注册了应用,并获取到了Appk...

l6666_6666的博客 567

【转载】 友盟社会化Android组件第三方登录

前段时间公司需要,逐步了新浪微博、腾讯qq、微信等授权登录验证的问题。如果要一个个申请,看文档写代码也是很多流程的。干脆用友盟社会化Android组件第三方登录友盟是集成了这些平台,还有其他主流的平台的。我在这里主要讲一下友盟里面微博登录。先看看友盟是怎么介绍自已的。 一、友盟社会化分享介绍 友盟社会化分享组件,帮助移动应用快速具备微信分享,微博分享、登录、评论、喜欢等社会化组件

u010097616的专栏 586

Android记录16-友盟第三方登录、分享实现

我最近从朋友那里收集到了2020-2021BAT 面试真题解析Android 基础、Java 基础、Android 源码相关分析、常见的一些原理性问题等等,可以很好地帮助大家深刻理解Android相关知识点的原理以及面试相关知识。这份资料把大厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节;还有 高级架构技术进阶脑图 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。这里也分享给广大面试同胞们,希望每位程序猿们都能面试成功~

2201_75604580的博客 748

QQ第三方登录

QQ第三方登录            在Android应用程序的开发过程中,很多时候需要加入用户登录/注册模块。除了自己动手设计登录界面并实现相应功能外,现在还可以借助百度、腾讯等开发者平台提供的第三方账号登录模块。最近研究了友盟社会化分享组件,对其提供的SDK中第三方登录的QQ模块进行了测试。本篇文章先对友盟用户注册、SDK下载及案例的下载做一个简单的介绍,然后针对测试程序的过程及代码进行...

weixin_34268310的博客 133

第三方登录

友盟第三方登录、分享实现流程 本篇博客给大家分享一个笔者正在做的关于第三方登录、分享的实例,这里选用的是友盟社会化组件。 博客大纲如下: 第三方登录流程 友盟支持第三方登录的平台 友盟社会化分享支持的平台 集成友盟社会化组件流程 友盟社会化SDK集成流程 注意事项 第三方登录流程 移动应用授权效果图如下:

simple_BUG的博客 1672

Android第三方登录详解1

安卓第三方登录

qq_29443203的博客 380

第三方qq登录(获取头像和昵称)

首先依赖 implementation 'com.github.bumptech.glide:glide:4.8.0' implementation 'com.squareup.picasso:picasso:2.3.2'   在app里面的 android下面加入   之后在清单文件中加入   这个包要是这个   App.java import android.a...

qq_41880285的博客 1961

iOS 友盟登录和分享

新手可以来看下,如果有错误可以告诉我哈。。。 QQ群:342672616 欢迎大家交流技术,分享技术,学习以及回馈 1. 集成友盟社会化组件流程 1. 1.1注册友盟账号 登陆友盟官网,在我的产品页面添加新应用,然后获取到Appkey。 1.2申请第...

chuoyi6322的博客 256

Android友盟第三方登录

最近项目中使用到了友盟(社会化Android组件),开始集成的时候没来及细读友盟提供的开发文档。现在来总结一下集成过程中遇到的问题。 ##### 1.申请第三方账号 友盟 新浪微博开放平台 微信开放平台 腾讯开放平台 具体操作可以跟上面的链接进行操作,也可参照:http://dev.umeng.com/social/android/operation#1_3 ...

weixin_33749242的博客 102
上一篇: Android定制RadioButton样式三种实现方法
下一篇: Android 软键盘盖住输入框或者布局的解决办法
ThunderRong
博客等级 码龄11年 13粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值