Android支付接入(八):Amazon亚马逊支付

来源:互联网 发布:苍云正太捏脸数据 编辑:程序博客网 时间:2024/05/16 12:00
下面跟大家一起走一遍Amazon亚马逊的支付,亚马逊目前刚把业务拓展到大陆市场,但这并不代表Amazon支付不成熟,恰恰相反,Amazon的支付流程,支付结果获取及测试另人称赞,支付流程、测试流程简洁可靠。

    源码链接:http://pan.baidu.com/share/link?shareid=2345870563&uk=473193131
    文档链接:http://pan.baidu.com/share/link?shareid=2085409847&uk=473193131

    好了,废话说多了也没用,看看Amazon支付流程:
   申请Amazon开发者帐号->添加新应用程序->添加应用程序内商品(消费类商品,授权类商品,订阅类商品)->导出JSON数据文件->集成Amazon支付->将导出的JSON文件copy到/mnt/sdcard/amazon.sdktester.json目录下->测试支付及修改直到通过测试->上架
  Amazon官方提供的支付通信流程图:

一:导出JSON数据文件如下:(填写了几个应用内商品导出的JSON文件就包含几个计费点)

二:drawable-hdpi文件夹中最好放置高分辨率的桌面图片(建议512*512),因为Kindlefire设备有个旋转菜单,96*96分辨率在上边太模糊。Android支付接入(八):Amazon亚马逊支付

三:做本地测试时必须安装AmazonSDKTester.apk,文件位置在:http://pan.baidu.com/share/link?shareid=2085409847&uk=473193131解压Apps-SDK,如下:

四:本地测试支付成功后,订阅商品可以在AmazonSDKTester.apk中查看:
Android支付接入(八):Amazon亚马逊支付Android支付接入(八):Amazon亚马逊支付Android支付接入(八):Amazon亚马逊支付Android支付接入(八):Amazon亚马逊支付

下边来看下代码实现:
     1.Manifest.xml中注册Amazon广播接收器:

 

[html] view plaincopy
  1. <receiver android:name ="com.amazon.inapp.purchasing.ResponseReceiver" >  
  2.        <intent-filter>  
  3.           <action android:name = "com.amazon.inapp.purchasing.NOTIFY"  
  4.                  android:permission ="com.amazon.inapp.purchasing.Permission.NOTIFY"/>  
  5.        </intent-filter>  
  6. </receiver>  

     程序中配置:

 

[java] view plaincopy
  1. @Override  
  2. protected void onStart() {  
  3. // TODO Auto-generated method stub  
  4. super.onStart();  
  5. PurchasingManager.registerObserver(new MyObserver(MainActivity.this));  
  6. }  

    2.添加jar包,以下是路径或者直接从源码中copy

    3.将导出的JSON文件copy到/mnt/sdcard/amazon.sdktester.json目录下

[java] view plaincopy
  1. private void copyDataBase () throws IOException{  
  2.        InputStream myInput = getAssets ().open("amazon.sdktester.json");  
  3.        String outFileName = path;  
  4.        OutputStream myOutput = new FileOutputStream (outFileName);  
  5.        byte[]buffer = new byte[1024];  
  6.        intlength;  
  7.        while((length = myInput.read (buffer)) > 0){  
  8.           myOutput.write (buffer, 0, length);  
  9.        }  
  10.        myOutput.flush ();  
  11.        myOutput.close ();  
  12.        myInput.close ();  
  13.     }  

  4.安装AmazonSDKTester.apk

  5.调用支付接口 

[java] view plaincopy
  1. PurchasingManager.initiatePurchaseRequest("qht200catcapcoin");  

    6.添加支付回调:

[java] view plaincopy
  1. class MyObserver extends BasePurchasingObserver{  
  2.   
  3. public MyObserver(Context arg0){  
  4. super(arg0);  
  5. // TODO Auto-generatedconstructor stub  
  6. }  
  7.    
  8. @Override  
  9. public void onItemDataResponse(ItemDataResponsearg0) {  
  10. // TODO Auto-generated methodstub  
  11. super.onItemDataResponse(arg0);  
  12.    
  13. }  
  14.    
  15. @Override  
  16. public void onPurchaseResponse(PurchaseResponsearg0) {  
  17. // TODO Auto-generated methodstub  
  18. super.onPurchaseResponse(arg0);  
  19.    
  20. switch(arg0.getPurchaseRequestStatus()) {  
  21.    
  22.           case SUCCESSFUL:  
  23.                
  24.               final Receipt receipt =arg0.getReceipt();  
  25.               switch (receipt.getItemType()) {  
  26.               //消耗品  
  27.               case CONSUMABLE:  
  28.               newAlertDialog.Builder(MainActivity.this).setTitle("支付成功").setMessage("成功购买"+productName).setPositiveButton("确定"null).show();  
  29.                  break;  
  30.               //授权内容,支付成功  
  31.               case ENTITLED:  
  32.               newAlertDialog.Builder(MainActivity.this).setTitle("支付成功").setMessage("成功激活正版游戏").setPositiveButton("确定"null).show();  
  33.                  break;  
  34.               //订阅内容,支付成功  
  35.               case SUBSCRIPTION:  
  36.                 
  37.                  break;  
  38.               }  
  39.                 
  40.               break;  
  41.           caseALREADY_ENTITLED:  
  42.          //已经授权过的,属于成功,此时将道具给玩家即可  
  43.             
  44.           break;  
  45.           case FAILED:  
  46.           Toast.makeText(MainActivity.this"支付失败", Toast.LENGTH_LONG).show();  
  47.                
  48.           break;  
  49.           case INVALID_SKU:  
  50.           Toast.makeText(MainActivity.this"无法识别的sku", Toast.LENGTH_LONG).show();  
  51.                
  52.           break;  
  53.            }  
  54.    
  55. }  
  56.    
  57. @Override  
  58. public void onGetUserIdResponse(GetUserIdResponsearg0) {  
  59. // TODO Auto-generated methodstub  
  60. super.onGetUserIdResponse(arg0);  
  61. }  
  62.    
  63. @Override  
  64. public void onSdkAvailable(boolean arg0) {  
  65. // TODO Auto-generated methodstub  
  66. super.onSdkAvailable(arg0);  
  67. }  
  68. }  

     MainActivity.java完整代码如下:
[java] view plaincopy
  1. package com.example.blogforamazonbilling;  
  2. import java.io.FileOutputStream;  
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.io.OutputStream;  
  6. importcom.amazon.inapp.purchasing.BasePurchasingObserver;  
  7. import com.amazon.inapp.purchasing.GetUserIdResponse;  
  8. import com.amazon.inapp.purchasing.ItemDataResponse;  
  9. import com.amazon.inapp.purchasing.PurchaseResponse;  
  10. import com.amazon.inapp.purchasing.PurchasingManager;  
  11. import com.amazon.inapp.purchasing.Receipt;  
  12. import android.os.Bundle;  
  13. import android.app.Activity;  
  14. import android.app.AlertDialog;  
  15. import android.content.Context;  
  16. import android.view.View;  
  17. import android.widget.Toast;  
  18.   
  19. public class MainActivity extends Activity {  
  20. private final String path ="/mnt/sdcard/amazon.sdktester.json";  
  21. private String productName;  
  22.   
  23. @Override  
  24. protected void onCreate(Bundle savedInstanceState) {  
  25. super.onCreate(savedInstanceState);  
  26. setContentView(R.layout.activity_main);  
  27. try {  
  28. copyDataBase();  
  29. catch (IOException e) {  
  30. // TODO Auto-generated catch block  
  31. e.printStackTrace();  
  32. }  
  33. //消耗类商品  
  34. findViewById(R.id.button1).setOnClickListener(newView.OnClickListener() {  
  35. @Override  
  36. public void onClick(View v) {  
  37. // TODO Auto-generated method stub  
  38. PurchasingManager.initiatePurchaseRequest("qht200catcapcoin");  
  39. productName = "200猫币";  
  40. }  
  41. });  
  42. //消耗类商品  
  43. findViewById(R.id.button2).setOnClickListener(newView.OnClickListener() {  
  44. @Override  
  45. public void onClick(View v) {  
  46. // TODO Auto-generated method stub  
  47. PurchasingManager.initiatePurchaseRequest("qht340catcapcoin");  
  48. productName = "340猫币";  
  49. }  
  50. });  
  51. //订阅类商品  
  52. findViewById(R.id.button3).setOnClickListener(newView.OnClickListener() {  
  53. @Override  
  54. public void onClick(View v) {  
  55. // TODO Auto-generated method stub  
  56. PurchasingManager.initiatePurchaseRequest("qhtactive");  
  57. productName = "激活正版游戏";  
  58. }  
  59. });  
  60. }  
  61. @Override  
  62. protected void onStart() {  
  63. // TODO Auto-generated method stub  
  64. super.onStart();  
  65. PurchasingManager.registerObserver(newMyObserver(MainActivity.this));  
  66. }  
  67. private void copyDataBase () throws IOException{  
  68.        InputStream myInput = getAssets ().open("amazon.sdktester.json");  
  69.        String outFileName = path;  
  70.        OutputStream myOutput = new FileOutputStream(outFileName);  
  71.        byte[] buffer = new byte[1024];  
  72.        int length;  
  73.        while ((length = myInput.read (buffer))> 0){  
  74.           myOutput.write (buffer, 0, length);  
  75.        }  
  76.        myOutput.flush ();  
  77.        myOutput.close ();  
  78.        myInput.close ();  
  79.     }  
  80. class MyObserver extends BasePurchasingObserver{  
  81.   
  82. public MyObserver(Context arg0) {  
  83. super(arg0);  
  84. // TODO Auto-generated constructor stub  
  85. }  
  86. @Override  
  87. public void onItemDataResponse(ItemDataResponse arg0) {  
  88. // TODO Auto-generated method stub  
  89. super.onItemDataResponse(arg0);  
  90. }  
  91. @Override  
  92. public void onPurchaseResponse(PurchaseResponse arg0) {  
  93. // TODO Auto-generated method stub  
  94. super.onPurchaseResponse(arg0);  
  95. switch (arg0.getPurchaseRequestStatus()) {  
  96.            caseSUCCESSFUL:  
  97.                
  98.               final Receipt receipt =arg0.getReceipt();  
  99.               switch(receipt.getItemType()) {  
  100.               //消耗品  
  101.               case CONSUMABLE:  
  102.               newAlertDialog.Builder(MainActivity.this).setTitle("支付成功").setMessage("成功购                    买"+productName).setPositiveButton("确定"null).show();  
  103.                  break;  
  104.               //授权内容,支付成功  
  105.               case ENTITLED:  
  106.               newAlertDialog.Builder(MainActivity.this).setTitle("支付成功").setMessage("成功激                    活正版游戏").setPositiveButton("确定"null).show();  
  107.                  break;  
  108.               //订阅内容,支付成功  
  109.               case SUBSCRIPTION:  
  110.                
  111.                  break;  
  112.               }  
  113.                 
  114.               break;  
  115.            caseALREADY_ENTITLED:  
  116.           //已经授权过的,属于成功,此时将道具给玩家即可  
  117.                
  118.           break;  
  119.            caseFAILED:  
  120.           Toast.makeText(MainActivity.this"支付失败",Toast.LENGTH_LONG).show();  
  121.                
  122.           break;  
  123.            caseINVALID_SKU:  
  124.           Toast.makeText(MainActivity.this"无法识别的sku",Toast.LENGTH_LONG).show();  
  125.                
  126.           break;  
  127.            }  
  128. }  
  129. @Override  
  130. public void onGetUserIdResponse(GetUserIdResponse arg0){  
  131. // TODO Auto-generated method stub  
  132. super.onGetUserIdResponse(arg0);  
  133. }  
  134. @Override  
  135. public void onSdkAvailable(boolean arg0) {  
  136. // TODO Auto-generated method stub  
  137. super.onSdkAvailable(arg0);  
  138. }  
  139. }  
  140. }  

      以上就是Amazon亚马逊支付的接入流程,很简洁。等游戏发布到Amazon后才可以看到正式付费,但正式付费跟测试付费显示效果是一样的。如有任何疑问,请留言。

文章转载自Android支付接入(八):Amazon亚马逊支付,感谢Michael-Liu提供好文章
0 0
原创粉丝点击