海外SDK之----------谷歌支付

3 篇文章 0 订阅
1 篇文章 0 订阅
哈喽,么么哒!我们继续上次说好的谷歌支付。
同国内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

 

 
 
 
 
 
我是大嫂,爱你们的大嫂,富有爱心的大嫂。
 
 
 
 
 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值