哈喽,么么哒!我们继续上次说好的谷歌支付。
同国内sdk一样,支付必须得有商品ID才行,谷歌也一样,如果你是个人开发者,你得需要在 https://play.google.com/apps/publish/signup 这个网址花费25美金申请一个账户, 然后在后台创建你的应用,然后就是申请你支付信息,由于我也没有具体去申请过,所以我在这里转载一个网址 http://www.cnblogs.com/alphagl/p/6013625.html 他说的还是比较清楚的。
一开始呢创建应用呢,你需要上传一个你游戏的apk,记住你的包名和签名的,包名和签名尤为重要,切记!!!去申请你的商品ID,和获取谷歌支付Base64编码的RSA的公共密钥。
==========更新和获取谷歌支付的代码=====
同androidstudio为栗子 ANdroid SDK Manager。在extras中勾选Google Play Billing Library和Google Play Service。然后导入这2个包在你的androidstudio中 ,下载不下来的话请开VPN 嗖嗖快哦。 这里是下载路径 <android-sdk-root>/extras/google/play_billing 没有找到就全局搜索哦。
=========导入支付代码到sdk中==========
找到后把util文件下面的所有的文件复制或者导入到你工程的代码下,此外还有一个 IInAppBillingService.aidl 文件 在你的main的java代码出新建一个文件夹名为 aidl 把IInAppBillingService.aidl 以上到com的文件放入在你的aidl里面
我的文件图是这样的
最后记得添加谷歌支付权限 在你的mainfest.xml里面哈
<uses-permission android:name="com.android.vending.BILLING" />
=========支付的坑 我先写======
1.你的手机必须安卓谷歌框架,商店等服务
2.在你测试的支付的时候,你需要首先把你的谷歌账户添加到后台作为测试账户,在支付的不会真正的扣你钱!
3.你测试包的签名,一定要与你上传的签名一致,不然你会出现莫名其妙的错误。
4.你的谷歌账户一定要绑定vista卡,这个真有点麻烦,我的是运营给我提供的vista卡,这个你可以上万能的淘宝买,然后在绑定,。
5.支付出现从服务器检索错误 ,一般是你后台配置有错,或者你的 64位key有问题。
6,无法购买此商品。大概你没有把账户添加到谷歌后台的支付账户,或者你的商品ID是错误的!
7.如果以上你都成功了还是不能支付,请开vpn试试!
========又是写代码的时候了,天天写的都别激动======
类的私有变量
static final String GOOGLE_PAY_KEY = "你的64位key"; 尤为重要啊 错一个都不行 // The helper object IabHelper mHelper; // 支付对象
1.初始化谷歌play(这里会判断你手机的 支付服务和获取你商品购买的细节信息)
/** * 初始化谷歌 购买-消耗 的工具类 */ public void initGoogleHelper() { String base64EncodedPublicKey = GOOGLE_PAY_KEY; mHelper = new IabHelper(mActivity, base64EncodedPublicKey); // enable debug logging (for a production application, you should set this to false). mHelper.enableDebugLogging(true); /* * 检查是否有权限和连接到Google Billing service是否成功; * 若成功调用queryInventoryAsync查看产品id是否可以使用; * 查询完成后会调用IabHelper.QueryInventoryFinishedListener 这个回调接口进行通知,在这个接口中可以获取商品的详细信息SkuDetails和Purchase信息。 */ mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { public void onIabSetupFinished(IabResult result) { Log.d(TAG, "Setup finished."); if (!result.isSuccess()) { alert(null,"Problem setting up in-app billing: " + result); return; } if (mHelper == null) return; iap_is_ok = true; // IAB is fully set up. Now, let's get an inventory of stuff we own. Log.d(TAG, "Setup successful. Querying inventory."); // 获取商品列表 try { mHelper.queryInventoryAsync(mGotInventoryListener); } catch (IabHelper.IabAsyncInProgressException e) { alert(null,"Error querying inventory. Another async operation in progress."); } } }); }
========查询商品的回调====( product_list 是一个
String 类型的数组哈 里面填写的是我申请的商品ID)
inventory.hasDetails(product_id); 返回有关给定产品的详细信息是否可用
inventory.getSkuDetails(product_id);
返回应用内商品的列表详情
inventory.getPurchase(product_id)
返回给定产品的购买信息,如果没有购买,则返回null
/** * 查询方法的回调: */ IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() { public void onQueryInventoryFinished(IabResult result, Inventory inventory) { Log.d(TAG, "Query inventory finished."); // Have we been disposed of in the meantime? If so, quit. if (mHelper == null) return; // Is it a failure? if (result.isFailure()) { alert(null,"Failed to query inventory: " + result); return; } Log.d(TAG, "Query inventory was successful."); showToast("正在查询用户商品信息"); for(int i=0;i<product_list.length;i++) { String product_id = product_list[i]; Boolean b = inventory.hasDetails(product_id); if (b) { SkuDetails details = inventory.getSkuDetails(product_id); Log.d(TAG,product_id+" hasDetails = "+b+" price="+details.getPrice()+" priceAmountMicros="+ details.getPriceAmountMicros()+" currency="+ details.getPriceCurrencyCode()); try { mHelper.consumeAsync(inventory.getPurchase(product_id), mConsumeFinishedListener); } catch (IabAsyncInProgressException e) { // alert(null,"Error consuming. Another async operation in progress."); return; } } else { Log.d(TAG,product_id+" hasDetails = "+b); } } } };
=======接下来是几个回调消耗支付完成的======
verifyDeveloperPayload
验证购买的开发人员有效负载是否正确
我个人觉的这个步奏应该不需要也可以了,应该我们在支付成功回掉里面
getDeveloperPayload 也只是去获取的 Purchase枚举里面的数据
/**
* 消耗商品的回调:
*/
IabHelper.OnConsumeFinishedListener mConsumeFinishedListener = new IabHelper.OnConsumeFinishedListener()
{
public void onConsumeFinished(Purchase purchase, IabResult result)
{
Log.d(TAG, "Consumption finished. Purchase: " + purchase + ", result: " + result);
if (mHelper == null)
{
Log.d(TAG, "OnConsumeFinishedListener====mHelper===== null.");
return;
}
if (result.isSuccess())
{
// 消费成功 以下是游戏逻辑
Log.d(TAG, "Consumption successful. Provisioning.");
JSONObject json = new JSONObject();
try {
//json.put("autoRenewing", purchase.isAutoRenewing());
json.put("orderId", purchase.getOrderId());
json.put("packageName", purchase.getPackageName());
json.put("productId", purchase.getSku());
json.put("purchaseTime", purchase.getPurchaseTime());
json.put("purchaseState", purchase.getPurchaseState());
//json.put("developerPayload", purchase.getDeveloperPayload());
json.put("purchaseToken", purchase.getToken());
json.put("signature",purchase.getSignature());
json.put("type","2");
}catch (JSONException e) {
e.printStackTrace();
}
showToast("消耗商品成功的回调");
这里呢 就是支付成功的地方 你可以利用上面json信息去你的应用或者游戏服务器验证
// orderId 订单ID
// productId 商品ID
// purchaseToken 购买token
} else { alert(null,"Error while consuming: " + result); } Log.d(TAG, "End consumption flow."); }};/** * 支付完成的回调,如果是受管理的商品在此回调中直接可以将道具给用户 */IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() { public void onIabPurchaseFinished(IabResult result, Purchase purchase) { Log.d(TAG, "Purchase finished: " + result + ", purchase: " + purchase); // if we were disposed of in the meantime, quit. if (mHelper == null) return; if (result.isFailure()) { alert(null,"Error purchasing" + String.valueOf(result)); return; } if (!verifyDeveloperPayload(purchase)) { alert(null,"Error:Error purchasing. Authenticity verification failed."); return; } Log.d(TAG, "Purchase successful."); // 这里或者上面都可以 如果你有sdk支付数据上报功能 都可以在这里写 Log.d(TAG,"AFInAppEventType.PURCHAS"); showToast("支付完成的回调"); // 立即消费 try { mHelper.consumeAsync(purchase, mConsumeFinishedListener); } catch (IabAsyncInProgressException e) { alert(null,"Error consuming. Another async operation in progress."); return; } }};/** * 验证购买的开发人员有效负载是否正确 */boolean verifyDeveloperPayload(Purchase p){ String payload = p.getDeveloperPayload(); return true;}
==========支付函数=======
mHelper.launchPurchaseFlow 就是去支付的函数了 携带一个支付回调
自己封装的函数 有的参数对你没有什么用 传入商品ID 不出意外就会出现支付界面,输入你的账户密码 就会登录成功
public void Pay(String pid, String extra, final int cb) { String product_id = pid String payload = ""; if (iap_is_ok) { try { if (mHelper != null) mHelper.flagEndAsync(); mHelper.launchPurchaseFlow(mActivity,product_id,10001, mPurchaseFinishedListener); } catch (IabHelper.IabAsyncInProgressException e) { // 启动购买流程时出错。另一个异步操作正在进行中 alert(null,"Error launching purchase flow. Another async operation in progress."); } } else { alert("提示", "Google Play初始化失败,当前无法进行支付,请确定您所在地区支持Google Play支付或重启游戏再试!"); } }
哈哈O(∩_∩)O~~,到此谷歌支付我们已经基本结束了,看看是不是炒鸡简单的!坑真的还是挺多,尤其是添加测试账户,账户绑定海外的银行卡。当然细心点还是能解决问题的,结束!!!下次我们继续ios支付.随便有游戏开发的,技术交流的可以加群 197309807
我是大嫂,爱你们的大嫂,富有爱心的大嫂。