由于近期项目,要用到google+登陆和google play商店应用内商品支付,以及facebook登陆
所以经过查看官网介绍和示例应用来实现下其中的功能,
下面是使用中遇到的问题,希望对你有用!
欢迎各位,遇到问题给我发邮箱[email protected];或者直接留言回复.
适用于 Android的 Google+登录
1.准备工作
2.将“Google+登录”按钮添加到您的应用
3.退出用户帐户
4.撤消访问令牌和取消关联应用
5.自定义登录按钮
6.本地化
7.后续步骤
让用户安全地登录您的应用,体验更强大、更丰富精彩的功能。通过“Google+登录”,已登录的用户可以创建互动信息邀请自己的朋友使用您的应用,从而提升您的应用的参与度。通过使用 Google 将用户联系在一起,您的用户可以告诉自己的朋友,他们正在使用您的应用。这种口口相传的社交推荐可信度相当高,能够很快地提升您在 Google Play中的形象。
Google+登录按钮可以对用户进行身份验证以及管理 OAuth 2.0流程,这样可以简化与 Google API的集成。如果要创建互动信息、管理生活片段和抓取个人资料和人员信息,就必须登录应用。
用户随时可以选择撤消应用访问权限。
重要注意事项:您使用 Google+登录按钮需要遵守Google+平台按钮政策和Google+平台服务条款。
准备工作
您必须创建一个 GoogleAPI控制台项目并初始化 PlusClient对象。
在Google开发者平台申请一个专案,然后进入专案详情;菜单中有API和凭证菜单,找到凭证子菜单,进入主页面,进行添加Oauth2.0的客户端id;选择已安装的应用程序类型(Android),添加完整的包名和签名SHA1密文(小写)。
将“Google+登录”按钮添加到您的应用
1.将SignInButton添加到应用的布局:
2.使用Activity.onCreate处理程序中所请求的 Visible 活动初始化mPlusClient。
@Override
protectedvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
mPlusClient =newPlusClient.Builder(this,this,this)
.setVisibleActivities("http://schemas.google.com/AddActivity","http://schemas.google.com/BuyActivity")
.build();
}
3.在 Android活动中,注册按钮的OnClickListener,从而实现在用户点击时登录:
findViewById(R.id.sign_in_button).setOnClickListener(this);
4.用户点击登录按钮之后,您应着手解决mConnectionResult中记录的任何连接错误。可能的连接错误包括提示用户选择一个帐户,以及向授应用予访问权限。
@Override
publicvoid onClick(View view){
if(view.getId()== R.id.sign_in_button &&!mPlusClient.isConnected()){
if(mConnectionResult ==null){
mConnectionProgressDialog.show();
}else{
try{
mConnectionResult.startResolutionForResult(this, REQUEST_CODE_RESOLVE_ERR);
}catch(SendIntentException e){
// 重新尝试连接。
mConnectionResult =null;
mPlusClient.connect();
}
}
}
}
5.用户成功登录之后,应用会调用onConnected处理程序。此时,您便可以检索用户的帐户名或发送经过身份验证请求。
@Override
publicvoid onConnected(Bundle connectionHint){
mConnectionProgressDialog.dismiss();
Toast.makeText(this,"Useris connected!",Toast.LENGTH_LONG).show();
}
退出用户帐户
您可以为应用添加退出按钮。在应用中创建一个按钮用作退出按钮。为按钮附加onClickListener,并配置onClick方法以断开PlusClient:
@Override
publicvoid onClick(View view){
if(view.getId()== R.id.sign_out_button){
if(mPlusClient.isConnected()){
mPlusClient.clearDefaultAccount();
mPlusClient.disconnect();
mPlusClient.connect();
}
returntrue;
}
}
此代码会清除与应用相关联的帐户。要重新登录,用户需要重新选择自己的帐户。
撤消访问令牌和取消关联应用
您必须允许使用 Google帐户登录的用户取消与应用的关联,以确保遵守Google+开发者政策的条款。如果用户删除了自己的帐户,您必须删除应用从 Google API中获取的信息。
以下代码显示了调用PlusClient.revokeAccessAndDisconnect方法和响应onAccessRevoked事件的简单示例。
// 在取消关联之前,请运行 clearDefaultAccount()。
mPlusClient.clearDefaultAccount();
mPlusClient.revokeAccessAndDisconnect(newOnAccessRevokedListener(){
@Override
publicvoid onAccessRevoked(ConnectionResult status){
//mPlusClient 现在已断开,并且访问权限已被撤消。
// 触发应用逻辑以确保遵守开发者政策
}
});
在onAccessRevoked回调中,您可以响应事件并在触发应用或后端代码中任何适当的逻辑。有关详情,请参见开发者政策中的删除规则。
自定义登录按钮
您可以设计自定义登录按钮,让它完美地符合自己的设计风格。com.google.android.gms.common.SignInButton类可让您更改颜色主题和按钮的尺寸。如果您需要其他自定义,可以定义一个自定义按钮:
1.查看品牌塑造准则以及下载要在按钮中使用的图标和图片。
2.将按钮添加到应用布局中。
此示例加载了SDK中的经过本地化的文字。您还可以在自己活动onCreate的方法中使用getString(com.google.android.gms.R.string.common_signin_button_text_long),为按钮文字获取标签。不管您如何实施自己的登录按钮,都必须要遵守品牌塑造准则。
本地化
SDK 可以为 com.google.android.gms.common.SignInButton 按钮提供经过本地化的字符串,并且应用的用户可以自动使用这些字符串。要查看语言的完整列表,您可以查看 SDK 中的以下目录:目录
1.应用内结算概述...1
概述... 1
本文内容...1
相关示例...1
应用内结算 API1
应用内商品...2
商品类型...2
Google Play 开发者控制台...3
Google Play 购买流程...3
示例应用...3
迁移注意事项...4
2.管理应用内结算...4
本文内容...4
另请参见...4
创建商品列表...5
向商品列表逐一添加商品...6
向商品列表批量添加商品...8
选择商品类型...11
处理退款...11
使用订单号...12
设置测试帐户...12
获取应用的许可密钥...13
获取相关支持...14
1.应用内结算概述
概述
使用应用内结算销售数字商品,包括一次性商品和定期订阅。
在 Google Play 上发布的所有应用均可使用该服务。您只需有 Google Play 开发者控制台帐户和 Google 电子钱包商家帐户即可。
结帐流程由 Google Play 自动处理,其界面与应用购买流程的界面相同。
本文内容
相关示例
示例应用(第 3 版)
本文将介绍您需了解的应用内结算基本组件和功能,以便您将应用内结算功能添加到应用中。
注意:请务必遵守目标国家/地区(您要在这些国家/地区分发应用)的适用法律。例如,在欧盟国家,不公平商业行为指令的相关法律禁止直接规劝儿童购买广告产品或者劝说其父母或其他成年人为儿童购买广告产品。请参阅欧盟消费者保护机构的立场,详细了解此主题及其他主题。
应用内结算 API
您的应用会通过相应 API (由设备上安装的 Google Play 应用提供)来访问应用内结算服务。然后,Google Play 应用会在您的应用和 Google Play 服务器之间传送结算请求和响应。实际上,您的应用从不直接与 Google Play 服务器通信,而是通过进程间通信 (IPC) 向 Google Play 应用发送结算请求并接收 Google Play 应用发来的响应。此外,您的应用也不管理其与 Google Play 服务器之间的任何网络连接。
应用内结算只能在您通过 Google Play 发布的应用中实施。要完成应用内购买请求,Google Play 应用必须能够通过网络访问 Google Play 服务器。
应用内结算第 3 版是最新版本,依然具有非常广泛的兼容性,可用于各种 Android 设备。运行 Android 2.2 或更高版本且安装了最新版本的 Google Play 商店的设备(绝大多数有效设备)都支持使用应用内结算第 3 版。
第 3 版的功能
通过简化的 API 发送请求。此 API 可让您轻松地向 Google Play 请求商品详情、订购应用内商品以及根据用户对商品的所有权快速恢复商品
订单信息会在购买完成时同步传送到设备上
所有购买都是“托管的”(也就是说,Google Play 负责记录用户对应用内商品的所有权)。对于同一件应用内商品,用户无论何时都只能拥有该商品的一个副本而不能拥有多个副本
您可以消耗所购商品。当消耗后,该商品将切换回“未被拥有”状态,且可被用户从 Google Play 中再次购买
支持订阅
要详细了解应用内结算的其他版本,请参阅版本说明。
应用内商品
应用内商品是您在应用内向用户出售的数字商品,包括游戏代币、旨在改善用户体验的应用功能升级以及应用中的新增内容。
应用内结算只能用于销售数字内容,而不能用于销售实体商品、个人服务或任何需要进行实物交付的商品/服务。与明码标价的应用不同,一旦用户购买了应用内商品,系统便不会提供退款窗口。
Google Play 不提供任何形式的内容交付,您需要自行交付在应用内销售的数字内容。应用内商品始终与一个且仅与一个应用明确关联。也就是说,在一个应用中不能购买为另一个应用发布的应用内商品,即使这两个应用来自相同的开发者也是如此。
商品类型
应用内结算支持多种商品类型,因此您可灵活选择如何通过您的应用获利。无论是哪种商品,您均能通过 Google Play 开发者控制台进行定义。
您可以为应用内结算应用指定以下两类商品:“托管的应用内商品”和“订阅”。Google Play 会按用户帐户来处理和跟踪您应用中的应用内商品和订阅的所有权。详细了解应用内结算第 3 版支持的商品类型。
Google Play 开发者控制台
在开发者控制台上,您不仅能发布应用内结算应用,还能管理您应用中出售的各种应用内商品。
对于与您的应用相关联的数字商品(包括一次性商品和定期订阅),您可以为其创建商品列表。对于每件商品,您都可以定义下列信息:唯一商品 ID(也称为 SKU)、商品类型、定价、说明以及 Google Play 应如何处理和用户对该商品的购买。
您还可以创建测试帐户,授权这些帐户测试尚未发布的应用。
要了解如何使用开发者控制台配置您的应用内商品和商品列表,请参阅管理应用内结算。
Google Play 购买流程
Google Play 使用的结帐后端服务与用于应用购买的服务相同,因此您的用户将获得一致且熟悉的购买流程使用体验。
重要提示:您必须有 Google 电子钱包商家帐户才能在 Google Play 上使用应用内结算服务。
购买开始时,您的应用需要针对相应的应用内商品发送结算请求。然后,Google Play 会处理此次交易的所有结帐详情,包括请求和验证付款方式以及处理财务交易。
当结帐流程完成后,Google Play 会向您的应用发送购买详情,例如订单号、订单日期和时间以及所付价格。您的应用从不需要处理任何财务交易,这些事宜完全 Google Play 负责。
示例应用
为了帮您将应用内结算集成到您的应用中,Android SDK 提供了一个示例应用,向您演示如何在应用内销售应用内商品和订阅。
API 第 3 版的 TrivialDrive 示例演示了如何使用应用内结算 API 第 3 版在赛车游戏中实施应用内商品和订阅购买。该应用不仅演示了如何发送应用内结算请求以及处理来自 Google Play 的同步响应,还演示了如何通过此 API 记录商品的消耗情况。第 3 版示例包括多种工具类,非常便于处理应用内结算操作和执行自动签名验证。
建议:请务必在发布应用前混淆其中的代码。有关详情,请参阅安全性和设计。
迁移注意事项
应用内结算 API 第 2 版已弃用,将于 2015 年 1 月关闭。如果您现有的应用内结算实施使用的是 API 第 2 版或更低版本,则您必须迁移到应用内结算第 3 版。
如果您在发布的应用中销售应用内商品,请注意以下事项:
您之前在开发者控制台中定义的托管商品和订阅仍能使用第 3 版。
对于您已经为现有应用定义的非托管商品,如果您使用 API 第 3 版针对这些商品提出购买请求,这些商品将被视为托管商品。您无需在开发者控制台中为这些商品创建新的商品条目,且能使用相同的商品 ID 来购买这些商品。如果您使用 API 第 2 版或更低版本提出购买请求,这些商品仍会被视为非托管商品。
2.管理应用内结算
本文内容
创建商品列表
选择商品类型
设置测试帐户
处理退款
使用订单号
获取相关支持
另请参见
应用内结算概述
如果您使用应用内结算,您就无需处理任何财务交易。不过,您仍需执行一些管理任务,包括在Google Play 开发者控制台上创建和维护您的商品列表、注册测试帐户以及在需要时处理退款。
您必须有Google Play 发布商帐户才能注册测试帐户。而且,您必须有Google 电子钱包商家帐户才能创建商品列表以及向用户发放退款。如果您已有Google Play 发布商帐户,则可以使用您的现有帐户,无需注册新帐户就能使用应用内结算。
如果您没有发布商帐户,可以在Google Play 开发者控制台中以 Google Play 开发者的身份注册设置一个发布商帐户。如果您没有 Google 电子钱包商家帐户,也可以通过开发者控制台注册一个。
创建商品列表
Google Play 开发者控制台为您发布的每个应用都提供一份商品列表。您可以使用 GooglePlay 的应用内结算功能销售商品,但前提是该商品已在应用的商品列表中列出。每个应用都有自己的商品列表,您不能在某个应用中销售其他应用的商品列表中列出的商品。
您可以点击开发者帐户中列出的应用内的应用内商品链接,访问该应用的商品列表(参见图 1)。只有当您拥有 Google 电子钱包商家帐户且该应用的清单中包含com.android.vending.BILLING
权限时,应用内商品链接才会显示。
商品列表列出了您在应用内销售的商品(应用内商品、订阅内容或两者的组合)。对于每件商品,商品列表中都会包含商品ID、商品说明和价格等信息。商品列表只存储应用内所售商品的相关元数据,而不会存储任何数字内容。应用内销售的数字内容的存储和发送是由您负责的。
图 1.您可以点击“应用”主导航面板中的应用内商品链接,访问应用的商品列表。
您可以为所有已发布的应用或者Alpha 或Beta 渠道中的所有应用(这些应用上传并保存到开发者控制台)创建商品列表。不过,您必须有Google 电子钱包商家帐户且该应用的清单中必须包含com.android.vending.BILLING
权限。如果应用的清单中未包含此权限,您只能在商品列表中修改现有商品但不能向该列表添加新商品。要详细了解此权限,请参阅更新您应用的清单。
注意:过去,您可以通过上传未发布的“草稿”版本来测试应用,但现在系统已不再支持此功能。因此,您必须将应用发布到 Alpha 或 Beta 分发渠道,才能进行测试。有关详情,请参阅草稿应用不再受支持。
此外,一个应用包只能有一个商品列表。如果您为某个应用创建商品列表且使用多 APK 功能为该应用分发多个 APK,那么此商品列表将应用到与该应用商品详情相关联的所有 APK 版本。如果您使用的是多 APK 功能,则无法为各个 APK 创建单独的商品列表。
您可以通过两种方式向商品列表添加商品:通过应用内商品界面逐一添加商品(参见图2);通过导入逗号分隔值(CSV) 文件中的商品批量添加商品。如果您的应用只有几件应用内商品或您只是向商品列表添加几件测试商品,那么逐一添加商品这种方法就非常实用。如果您的应用有大量应用内商品,使用CSV 文件的方法就较为实用。
注意:目前系统尚不支持批量上传包含订阅内容的商品列表。
向商品列表逐一添加商品
要通过应用内商品界面向商品列表添加一件商品,请按以下步骤操作:
登录到您的发布商帐户。
在所有应用面板中,点击相应的应用名称,然后选择应用内商品。
点击添加新商品(参见图 2),提供所售商品的详细信息,然后点击保存或发布。
图 2.通过“添加新商品”页面,您可以向应用的商品列表添加商品。
对于商品列表中的每件商品,您都必须输入以下信息:
应用内商品 ID
每件商品的ID 在应用的命名空间中都是独一无二的。商品ID 必须以小写字母或数字开头,且只能由小写字母(a-z)、数字(0-9)、下划线(_) 和点(.) 组成。商品ID“android.test”是系统预留的ID,所有以“android.test”开头的商品 ID 都是如此。
此外,商品的商品ID 创建后就无法再修改,而且您不能重复使用任何商品ID。
商品类型
商品类型可以是按用户帐户管理的商品、不受管理的商品或订阅内容。商品类型设置后就无法再更改。有关详情,请参阅下文中的选择商品类型。
发布状态
商品的发布状态可以是已发布或未发布。为了让用户在结帐时可以看到所购商品,该商品的发布状态必须设置为已发布且该商品所属的应用必须已发布到 GooglePlay 上。
注意:这种情况并不适用于测试帐户。也就是说,对于测试帐户来说,即使应用未发布而商品已发布,测试帐户中的用户是可以看到该商品的。有关详情,请参阅测试应用内结算。
语言和翻译
您可以使用“添加翻译”按钮,为您的应用内商品提供经过本地化的标题和说明。如果您希望 GooglePlay 根据您的默认语言为您翻译标题和说明,只需点击您要提供的语言即可。如果您想自行翻译成特定语言,也是可以的。默认情况下,应用内商品会沿用其所属应用的默认语言。
标题
标题是对商品的简短描述,例如“沉睡药水”。每个标题在应用的命名空间中必须是独一无二的,且每件商品都必须有标题。标题在用户结帐时必须显示。为了获得最佳的显示效果,标题不应超过25 个字符;不过,标题最长可达55 个字符。
说明
说明是对商品的详细描述,例如“立即让服用者陷入沉睡,但对愤怒的精灵无效”。每件商品都必须有一段说明,最长可达 80 个字符。
价格
您必须提供一个以您本地货币为单位的默认价格。您也可以提供以其他货币为单位的价格,但前提是此货币所属的国家/地区是您的应用要定位的目标国家/地区。您可以在 Google Play 开发者控制台中的“修改应用”页面上指定目标国家/地区。
要指定以其他货币为单位的价格,您可以手动输入与每种货币对应的价格,也可以点击自动填充,让 Google Play 一次性将您的本地货币换算成目标货币(参见图 3)。
请注意,订阅型商品发布后就无法再更改其价格。
图 3.为应用内商品指定其他货币。
要详细了解商品ID 和商品列表,请参阅创建应用内商品 ID。要详细了解定价,请参阅应用内结算定价。
注意:请务必规划好您的商品 ID 命名空间。商品 ID 保存后就无法再重复使用或更改。
向商品列表批量添加商品
要使用CSV 文件向商品列表批量添加商品,您需要先创建CSV 文件。您在CSV 文件中指定的数据值与您通过应用内商品界面手动指定的数据值相同(请参阅向商品列表逐一添加商品)。
如果您通过CSV 文件导入和导出应用内商品,请记得提供含税价格。如果您使用自动填充,请提供不含税的默认价格,系统会自动填充含税的价格。如果您不使用自动填充,您提供的价格必须是含税价格。
注意:目前系统尚不支持批量上传包含订阅内容的商品列表。
CSV 文件使用逗号 (,) 和分号 (;) 来分隔数据值。逗号用来分隔主要数据值,分号用来分隔次要数据值。例如,CSV 文件的语法如下所示:
"product_id","publish_state","purchase_type","autotranslate","locale;title;description","autofill","country;price"
相关说明和使用详情如下所示。
product_id
等同于应用内商品界面中的“应用内商品 ID”设置。如果您指定的“product_id”在商品列表中已经存在,且您选择在导入 CSV 文件时覆盖商品列表,则 CSV 文件中指定的值就会覆盖现有商品的数据。覆盖功能不会删除商品列表中已列出但不包含在CSV 文件中的商品。
publish_state
等同于应用内商品界面中的“发布状态”设置。值可以是published
或unpublished
。
purchase_type
等同于应用内商品界面中的“商品类型”设置。值可以是managed_by_android
(等同于应用内商品界面中的按用户帐户管理的商品)或managed_by_publisher
(等同于应用内商品界面中的不受管理的商品)。
autotranslate
等同于选中应用内商品界面中的使用自动翻译填充字段复选框。值可以是true
或false
。
locale
等同于应用内商品界面中的“语言”设置。您必须有一个默认语言区域项。默认语言区域必须是语言区域列表中的第一项,且必须包含“title”和“description”。如果除默认语言外您还想提供翻译版本的“title”和“description”,则必须使用下面的语法规则:
如果“autotranslate”为true
,您必须按照以下格式指定默认语言区域、默认标题、默认说明及其他语言区域:
"true,"default_locale;default_locale_title;default_locale_description;locale_2;locale_3,..."
如果“autotranslate”为false
,您必须按照以下格式指定默认语言区域、默认标题、默认说明以及翻译后的标题和说明:
"false,"default_locale;default_locale_title;default_locale_description;locale_2;locale_2_title;local_2_description;locale_3;locale_3_title;locale_3_description;..."
请参见表1,了解您可以在“locale”字段中使用的语言代码的列表。
title
等同于应用内商品界面中的“标题”设置。如果“title”包含分号,必须使用反斜杠进行转义(例如“\;”)。如果标题本身包含反斜杠,也应使用反斜杠进行转义(例如“\\”)。
description
等同于应用内商品界面中的“说明”。如果“description”包含分号,则必须使用反斜杠进行转义(例如“\;”)。如果说明本身包含反斜杠,也应使用反斜杠进行转义(例如“\\”)。
autofill
等同于点击应用内商品界面中的自动填充。值可以是true
或false
。用于指定“country”和“price”的语法视您使用的“autofill”设置而定。
如果“autofill”设为true
,您只需指定采用本地货币的默认价格且必须使用以下语法:
"true","default_price_in_home_currency"
如果“autofill”设为false
,您需要为每种货币指定“country”和“price”且必须使用以下语法:
"false", "home_country;default_price_in_home_currency;country_2;country_2_price;country_3;country_3_price;..."
country
您为其指定价格的国家/地区。您只能列出您的应用所定位的国家/地区。国家/地区代码是按照ISO 3166-2的定义,由两个大写字母组成的 ISO 国家/地区代码(例如“US”)。
price
等同于应用内商品界面中的“价格”。此价格必须使用微单位指定。要将货币值换算成微单位,请用实际值乘以1,000,000。例如,如果您要以1.99 元销售某件应用内商品,则需要在“price”字段中输入 1990000。
表 1.您可以在“locale”字段中使用的语言代码。
语言 |
代码 |
语言 |
代码 |
中文 |
zh_TW |
意大利语 |
it_IT |
捷克语 |
cs_CZ |
日语 |
ja_JP |
丹麦语 |
da_DK |
韩语 |
ko_KR |
荷兰语 |
nl_NL |
挪威语 |
no_NO |
英语 |
en_US |
波兰语 |
pl_PL |
法语 |
fr_FR |
葡萄牙语 |
pt_PT |
芬兰语 |
fi_FI |
俄语 |
ru_RU |
德语 |
de_DE |
西班牙语 |
es_ES |
希伯来语 |
iw_IL |
瑞典语 |
sv_SE |
印地语 |
hi_IN |
-- |
-- |
要导入您在CSV 文件中指定的商品,请执行以下操作:
登录到您的发布商帐户。
在所有应用面板中,点击相应的应用名称,然后选择应用内商品。
在“应用内商品列表”页面上,点击导入/导出>从 CSV 文件中导入应用内商品,然后选择 CSV 文件。
CSV 文件必须位于您的本地计算机上或连接到您计算机的本地磁盘上。
如果您想覆盖商品列表中的现有商品,请选中覆盖复选框。
只有当CSV 文件中的“product_id”值与商品列表中现有商品的应用内商品 ID 一致时,此选项才会覆盖现有商品的值。覆盖功能不会删除商品列表中已列出但不包含在CSV 文件中的商品。
您还可以点击“应用内商品列表”页面上的导出为CSV,将现有商品列表导出为CSV 文件。如果您已将商品手动添加到商品列表,但现在想开始通过CSV 文件管理该商品列表,此功能就非常有用。
选择商品类型
商品的商品类型用来控制Google Play 如何管理该商品的购买流程。商品类型有以下三种:“按用户帐户管理的商品”、“不受管理的商品”和“订阅内容”。但请注意,不同版本的应用内结算服务支持的商品类型不同,因此务必根据您的应用所用的应用内结算版本,选择合适的商品类型。
有关详情,请参阅应用内结算第 3 版或应用内结算第 2 版的相关文档。
处理退款
应用内结算不允许用户向Google Play 发送退款申请。应用内购买的退款事宜必须直接发送给您(应用开发者)。然后,您可以通过您的Google 电子钱包商家帐户处理这笔退款。当您处理退款时,GooglePlay 会收到Google 电子钱包发来的退款通知,并且Google Play 会向您的应用发送退款消息。有关详情,请参阅处理 IN_APP_NOTIFY 消息和应用内结算定价。
重要提示:您不能使用 Google Wallet API 发放退款或取消应用内结算交易,而是必须通过您的 Google 电子钱包商家帐户手动执行此类操作。不过,您可以使用 GoogleWallet API 检索订单信息。
使用订单号
当用户购买应用内商品时,Google电子钱包会为此次交易分配一个永久有效且独一无二的订单号。GooglePlay 在购买流程结束时会向您提供该订单号,作为PURCHASE_STATE_CHANGED
Intent 中的orderId
字段的值。
在您的应用中,您可以使用该订单号作为此次应用内购买交易的通用标识符。购买后,您可以利用该订单号在对帐报表中跟踪此次交易,以及在提供客户支持时使用该订单号。
订单号是完全由数字构成的字符串,格式由Google 电子钱包指定和管理。
对于发生在2012 年12 月5 日及以后的交易,Google电子钱包会分配一个商家订单号(而非Google 订单号)并将该商家订单号报告为orderID
的值。示例如下:
"orderId":"12999556515565155651.5565135565155651"
对于发生在2012 年12 月5 日之前的交易,GoogleCheckout 分配的是Google 订单号并已将该编号报告为orderID
的值。下面是使用 Google 订单号的orderID
的示例:
"orderId":"556515565155651"
设置测试帐户
通过Google Play 开发者控制台,您可以设置一个或多个测试帐户。测试帐户是您在开发者控制台上注册为测试帐户的常规Google 帐户。测试帐户已获得授权,可从您已上传到Google Play 开发者控制台但尚未发布的应用中进行应用内购买。
您可以使用任意Google 帐户作为测试帐户。如果您想让多位用户在应用上测试应用内结算但又不想让他们获得您的发布商帐户的登录凭据,测试帐户就非常有用。如果您想拥有并控制测试帐户,可以自行创建帐户,然后将凭据分发给您的开发者或测试者。
测试帐户有三条限制:
测试帐户用户只能在已上传到您的发布商帐户的应用(该应用可以是尚未发布的)中提出购买请求。
测试帐户只能用来购买应用的商品列表中已列出(并已发布)的商品。
测试帐户用户无法访问您的发布商帐户,也不能向您的发布商帐户上传应用。
要向您的发布商帐户添加测试帐户,请按以下步骤操作:
登录到您的发布商帐户。
点击设置图标。
找到“许可测试”面板。
添加您要注册为测试帐户的电子邮件地址,各帐户之间用英文逗号分隔。
点击保存,保存您的个人资料更改。
获取应用的许可密钥
Google Play 开发者控制台为每个应用都提供一个公用的许可密钥。要获取应用的密钥,请按以下步骤操作:
打开所有应用面板。
点击相应的应用名称,然后选择服务和 API。
向下滚动到此应用的许可密钥字段,找到应用的密钥,如下图所示。
过去,开发者控制台为每个开发者帐户都提供一个公钥。为了将应用迁移到按应用分配的新公钥,开发者控制台将应用专用密钥设置为之前的开发者密钥。这样做可确保依赖于(之前的)开发者密钥的应用能与新公钥兼容。
图 4.您可以在服务和 API面板中找到各个应用的许可密钥。
获取相关支持
如果您在实施应用内结算时有疑问或遇到问题,请与下表列出的支持资源联系(参见表2)。将您的问题发布到正确的论坛上,可以更快获得所需支持。
表 2.适用于 Google Play 应用内结算的开发者支持资源
支持类型 |
资源 |
主题范围 |
开发与测试问题 |
Google 网上论坛:android-developers |
应用内结算集成问题、有关用户体验的提示、对响应的处理、混淆代码、进程间通信 (IPC)、测试环境设置。 |
堆栈溢出:http://stackoverflow.com/questions/tagged/ android |
||
结算问题跟踪器 |
结算项目问题跟踪器 |
与应用内结算示例代码直接相关的错误和问题报告。 |
要了解如何向上述所列论坛发帖的一般信息,请参阅“资源”标签中的开发者论坛一文。
一,准备好开发者账号
开发者账号怎么设置我就不说了。和人人平台基本一样。很多平台都这样。
在得到 Application ID (App ID/ API Key)和 Application secret(App Secret)之后,记录好这两项,准备做接入。当然,还要牢记你自己的Canvas Page。
好,下一步。在开发者账号创建了这个应用之后,你可以访问一下Canves Page。
例如:http://apps.facebook.com/xxxapptest/
看一下效果。正常的话,可以看到连接到你的网站主页上了。
二,认证与授权
Facebook平台的身份验证和授权是基于OAuth 2.0协议的(OAuth 2.0 protocol)。
用户在登录之后可以有两种方式做身份验证和授权:服务器端(server-side)和客户端(client-side)。无论用哪种,都需要遵守下面的三步:用户身份验证(user authentication),用户授权(app authorization),和应用身份验证(app authentication)。用户身份验证是确认用户身份;用户授权是让用户确认将会提供给应用什么样的个人数据和内容;应用身份验证是确认用户把他们的资料给的是你的应用,而不是别人。一旦这些步骤完成了,你的应用将会获得到一个用户访问令牌(user access token),这样你的应用就能获取到用户的信息,并且可以获取到用户的活动和行为了。
----------------------------------------------------------------------------------------------
1. 用户授权(userauthorization)
下边我只说服务器端的认证授权流程。
获取用户基本信息的授权方式:
用户第一次登陆,facebook把用户跳转到我们的应用服务器,那么我们要调用这样一个url:
https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL
其实就是调用facebook的标准认证对话框(OAuth Dialog)。如果用户点击确认了,注意,这个授权,应用只能是获取到用户的基本信息的,也就是facebook上用户的公共信息。例如ID,主页,用户的名字。
获取用户的其他信息的授权方式:
如果想获取到用户的其他信息,就必须明确的告诉用户,你的应用需要哪些用户的信息,像下面这样:
https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&scope=email,read_stream
scope参数里面,指定了你的应用想要获取的用户信息。
用户同意授权
假如用户点击了同意(Allow),那么你的应用就会被用户授权了。授权对话框( OAuth Dialog)将会带着认证码(authorization code)参数跳转(via HTTP 302)到你的服务器的url。我查看了整个授权后的request,发现,facebook把认证码放在了GET里,其他的信息在POST里。GET里面会有一个code参数,好长一串,这个就是授权码。有了这个code,我们就可以进行下一步应用身份验证了。
----------------------------------------------------------------------------------------------
2. 应用身份验证(app authentication)
为了验证你的应用(app),你必须把上面得到的授权码(authorization code)和你的应用密钥(App Secret)传给 Graph API的令牌终点(tokenendpoint):
https://graph.facebook.com/oauth/access_token
格式是这样的:
https://graph.facebook.com/oauth/access_token?
client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&
client_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE
如果你的应用成功的通过了认证,并且你的用户的授权码也是合法的,那么授权服务器将会返回访问令牌(access token)。
----------------------------------------------------------------------------------------------
现在我们来看一下,网站接收到的facebook传来的request的POST数据:
注意,此时是在没有授权的情况下,从平台发过来的请求。
u'fb_sig_time': [u'1310471486.9658'],
u'fb_sig_added': [u'0'],
u'fb_sig_locale': [u'zh_CN'],
u'fb_sig_in_iframe': [u'1'],
u'fb_sig_in_new_facebook': [u'1'],
u'fb_sig_country': [u'us'],
u'fb_sig':[u'6edf97802d706b84753a4a328d65b1cc'],
u'fb_sig_api_key':[u'6361833388ca80696ad667af7abcceee'],
u'fb_sig_app_id': [u'120306072668168']
好,按照facebook的规则,要想得到用户的信息,你的这个应用必须得到用户的授权(Authorization)。这个授权,就好比,用户在facebook上,确认安装你的游戏。
授权的格式,开发者文档写的很明白:
https://www.facebook.com/dialog/oauth?
client_id=YOUR_APP_ID&redirect_uri=YOUR_CANVAS_PAGE
上面我们说的Application ID(app ID)和Canves Page在这里就能用得上了。
在浏览器中输入这个授权url,就会看到你的应用的用户授权页。
当用户点击确定授权的时候,facebook将会给我们的网站发来这样的request内容:
POST:
u'fb_sig_time': [u'1310627493.7758'],
u'fb_sig_added': [u'1'],
u'fb_sig_locale': [u'zh_CN'],
u'fb_sig_in_iframe': [u'1'],
u'fb_sig_in_new_facebook': [u'1'],
u'fb_sig_profile_update_time': [u'1256108103'],
u'fb_sig_country': [u'us'],
u'fb_sig_ss': [u's2Ke_YrygH7T8aEd9Lmcrg__'],
u'fb_sig_user': [u'100000413372683'],
u'fb_sig_cookie_sig':[u'3bce4346fd8f2f62c347eae9e89ae2d8'],
u'fb_sig_session_key': [u'2.AQC9WncK12nGzWCn.3600.1310634000.0-100000413372683'],
u'fb_sig_expires': [u'1310634000'],
u'fb_sig': [u'af28d8df0e0ec5fbbf01ec430622278d'],
u'fb_sig_api_key':[u'6361833388ca80696ad667af7abcceee'],
u'fb_sig_app_id': [u'120306072668168']
可以看见,POST里面已经有了uid了。
授权(authorization)
为了给用户创造人性化(personalize)的体验,Facebook将把用户的信息,在用户允许的情况下发送给你的应用。这些信息将通过HTTP POST里的signed_request参数传给你的应用。signed_request其实就是一个经过base64url编码的JSON对象。所以,在你解码之前,signed_request的内容看上去就是一个用点(.)分割的长串数据。
用户第一次访问你的应用的时候,signed_request参数只包含下面这些数据(如果你看不到数据,只看到一长串字母数字,那请先看下边的解码签名请求)。可以看到,几乎没有什么有用的用户数据:
Name |
Description |
user |
A JSON array containing the locale string, country string and the age object (containing the min and max numbers of the age range) for the current user.里面只有local,county,和age没有uid和token! |
algorithm |
A JSON string containing the mechanism used to sign the request. |
issued_at |
A JSON number containing the Unix timestamp when the request was signed. |
为了获取有用的用户信息,比如用户在Facebook的ID,那么你需要得到用户的授权。官方建议是使用认证对话框(OAuth Dialog)进行用户对应用的授权。怎么引用这个对话框,进行授权呢?其实就是在你的服务器端或者页面端,跳转到 Facebook指定的URL。这个URL规则如下:
https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_CANVAS_PAGE
当跳转到这个URL的时候,就会出现facebook标准的认证对话框了。注意,上面这种规则的URL授权对话框,你的应用只能是获取到用户的基本信息的,也就是facebook上用户的公共信息。例如ID,主页,用户的名字。如果你想获取到用户的其他信息,就必须明确的告诉用户,你的应用需要获取哪些用户的信息,像下面这样:
https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&scope=email,read_stream
注意,scope参数里面,指定了你的应用想要获取的用户信息。
假如用户点击了同意(allow),那么用户就对应用授权了。授权后,signed_request参数将含下面这些数据。可以看到,可以得到重要的两项:用户的id,就是user_id;和oauth_token。
Name |
Description |
user |
A JSON array containing thelocalestring,countrystring and theageobject (containing theminandmaxnumbers of the age range) for the current user. |
algorithm |
A JSON string containing the mechanism used to sign the request. |
issued_at |
A JSON number containing the Unix timestamp when the request was signed. |
user_id |
A JSON string containing the Facebook user identifier (UID) of the current user. |
oauth_token |
A JSON string that you can pass to theGraph APIor theLegacy REST API. |
expires |
A JSON number containing the Unix timestamp when theoauth_tokenexpires. |
解码签名请求(Decode Signed Request)
Facebook把请求做了签名。形成了signed_request这个东西。signed_request其实就是一个经过base64url编码的JSON对象。直接取过来,就是一个用"."分割的字符串。我们要做的,是把点前面的字符串解码,就是验证是否是facebook的合法sig;把点后面的字符串解码,就是facebook传给你应用的具体数据data。
具体算法python版:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# reques就是facebook发过来的请求 params = request.POST.copy() signed_request = params.get('signed_request') # signed_request传到python这边, 数据结构是一个字符串型的list ifisinstance(signed_request, list): signed_request = signed_request[0] encoded_sig, payload = signed_request.split(".", 2) # 余数2, 那么需要补一个= payload = str(payload) iflen(payload)%3 == 2: payload +='=' # 余数1, 那么需要补两个= iflen(payload)%3 == 1: payload +='==' # urlsafe_b64decode() Decode string s using a URL-safe alphabet, # which substitutes - instead of +and_ instead of / in the standard Base64 alphabet. # 得到data data = simplejson.loads(base64.urlsafe_b64decode(payload)) # 得到sig encoded_sig = str(encoded_sig) iflen(encoded_sig)%3 == 2: encoded_sig +='=' iflen(encoded_sig)%3 == 1: encoded_sig +='==' sig = base64.urlsafe_b64decode(encoded_sig) |
获取用户信息
经过上面的解码签名请求后,可以获取到FB的数据了。就是上面代码里的data。如果里面有'user_id'那么就说明,uid和oauth_toke都有了。请注意,如果您用的是国内服务器,是不可以直接调用facebook API接口的。
1 2 3 4 5 |
if'user_id'in data: uid = data['user_id'] params_dic = {} params_dic['uid'] = uid params_dic['oauth_token'] = data['oauth_token'] |
有了这uid和oauth_toke,我们就可以获取其他的用户信息了。下面是获取几个重要接入属性的方法。如果不明白为什么这么写,可以参考facebook开发文档。
用户昵称:
graph_url ="https://graph.facebook.com/%s" % uid
facebook_usr_info = simplejson.loads( urllib2.urlopen(graph_url).read() )
name = facebook_usr_info['name']
好友列表:
graph_url ="https://graph.facebook.com/me/friends?access_token=%s" % oauth_token
f_dic = simplejson.loads(urllib2.urlopen(graph_url).read())
friends_ids = f_dic['data']
头像:
headurl = 'http://graph.facebook.com/' + uid + '/picture'
注意事项:
首先需要在facebook 开发者平台https://developers.facebook.com/
注册你的app程序,选择Android,下一步就会弹出中文使用步骤。包括SDK下载安装等。
1.点击新建的app,进入桌面工作台,可以看到AppID和App Secret
2.左侧Settings菜单进入,设置DisplayName Namespace;下面有Android板块填写对应的
Google Play Package Name、Class Name、Key Hashes。
3.左侧Status & Review菜单进入,设置Status为Yes,点击确定,把需要填写和确认的都确认。