下面跟大家一起走一遍Amazon亚马逊的支付,亚马逊目前刚把业务拓展到大陆市场,但这并不代表Amazon支付不成熟,恰恰相反,Amazon的支付流程,支付结果获取及测试另人称赞,支付流程、测试流程简洁可靠。不想国内三个运营商,典型的国企,支付成功与否的判断标准仅仅是看短信是否发送出去,连个二次握手都没有,更没有安全可靠之说。在此并无他意,只是在对比运营商支付跟其他支付后的感触。但不可否认的是运营商支付在大陆移动付费端堪称龙头,尽管它并不安全,这就是现状。。。

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

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

二:drawable-hdpi文件夹中最好放置高分辨率的桌面图片(建议512*512),因为Kindle fire设备有个旋转菜单,96*96分辨率在上边太模糊。

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

四:本地测试支付成功后,订阅商品可以在AmazonSDKTester.apk中查看:

下边来看下代码实现:

     1. Manifest.xml中注册Amazon广播接收器:

<receiver android:name = "com.amazon.inapp.purchasing.ResponseReceiver" >

<intent-filter>

<action android:name = "com.amazon.inapp.purchasing.NOTIFY"

android:permission = "com.amazon.inapp.purchasing.Permission.NOTIFY"/>

</intent-filter>

</receiver>

程序中配置:

@Override

protected void onStart() {

// TODO Auto-generated method stub

super.onStart();

PurchasingManager.registerObserver(new MyObserver(MainActivity.this));

}

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

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

private void copyDataBase () throws IOException{

InputStream myInput = getAssets ().open ("amazon.sdktester.json");

String outFileName = path;

OutputStream myOutput = new FileOutputStream (outFileName);

byte[] buffer = new byte[1024];

int length;

while ((length = myInput.read (buffer)) > 0){

myOutput.write (buffer, 0, length);

}

myOutput.flush ();

myOutput.close ();

myInput.close ();

}

4.安装AmazonSDKTester.apk

5.调用支付接口

PurchasingManager.initiatePurchaseRequest("qht200catcapcoin");

     6.添加支付回调:

class MyObserver extends BasePurchasingObserver{

public MyObserver(Context arg0) {

super(arg0);

// TODO Auto-generated constructor stub

}

@Override

public void onItemDataResponse(ItemDataResponse arg0) {

// TODO Auto-generated method stub

super.onItemDataResponse(arg0);

}

@Override

public void onPurchaseResponse(PurchaseResponse arg0) {

// TODO Auto-generated method stub

super.onPurchaseResponse(arg0);

switch (arg0.getPurchaseRequestStatus()) {

case SUCCESSFUL:

final Receipt receipt = arg0.getReceipt();

switch (receipt.getItemType()) {

//消耗品

case CONSUMABLE:

new AlertDialog.Builder(MainActivity.this).setTitle("支付成功").setMessage("成功购                                      买"+productName).setPositiveButton("确定", null).show();

break;

//授权内容,支付成功

case ENTITLED:

new AlertDialog.Builder(MainActivity.this).setTitle("支付成功").setMessage("成功激活正                                 版游戏").setPositiveButton("确定", null).show();

break;

//订阅内容,支付成功

case SUBSCRIPTION:

break;

}

break;

case ALREADY_ENTITLED:

//已经授权过的,属于成功,此时将道具给玩家即可

break;

case FAILED:

Toast.makeText(MainActivity.this, "支付失败", Toast.LENGTH_LONG).show();

break;

case INVALID_SKU:

Toast.makeText(MainActivity.this, "无法识别的sku", Toast.LENGTH_LONG).show();

break;

}

}

@Override

public void onGetUserIdResponse(GetUserIdResponse arg0) {

// TODO Auto-generated method stub

super.onGetUserIdResponse(arg0);

}

@Override

public void onSdkAvailable(boolean arg0) {

// TODO Auto-generated method stub

super.onSdkAvailable(arg0);

}

}

MainActivity.java完整代码如下:


package com.example.blogforamazonbilling;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import com.amazon.inapp.purchasing.BasePurchasingObserver;
import com.amazon.inapp.purchasing.GetUserIdResponse;
import com.amazon.inapp.purchasing.ItemDataResponse;
import com.amazon.inapp.purchasing.PurchaseResponse;
import com.amazon.inapp.purchasing.PurchasingManager;
import com.amazon.inapp.purchasing.Receipt;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {
private final String path = "/mnt/sdcard/amazon.sdktester.json";
private String productName;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
copyDataBase();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//消耗类商品
findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
PurchasingManager.initiatePurchaseRequest("qht200catcapcoin");
productName = "200猫币";
}
});
//消耗类商品
findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
PurchasingManager.initiatePurchaseRequest("qht340catcapcoin");
productName = "340猫币";
}
});
//订阅类商品
findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
PurchasingManager.initiatePurchaseRequest("qhtactive");
productName = "激活正版游戏";
}
});
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
PurchasingManager.registerObserver(new MyObserver(MainActivity.this));
}
private void copyDataBase () throws IOException{
        InputStream myInput = getAssets ().open ("amazon.sdktester.json");
        String outFileName = path;
        OutputStream myOutput = new FileOutputStream (outFileName);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read (buffer)) > 0){
            myOutput.write (buffer, 0, length);
        }
        myOutput.flush ();
        myOutput.close ();
        myInput.close ();
    }
class MyObserver extends BasePurchasingObserver{

public MyObserver(Context arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
@Override
public void onItemDataResponse(ItemDataResponse arg0) {
// TODO Auto-generated method stub
super.onItemDataResponse(arg0);
}
@Override
public void onPurchaseResponse(PurchaseResponse arg0) {
// TODO Auto-generated method stub
super.onPurchaseResponse(arg0);
switch (arg0.getPurchaseRequestStatus()) {
            case SUCCESSFUL:
               
                final Receipt receipt = arg0.getReceipt();
                switch (receipt.getItemType()) {
                //消耗品
                case CONSUMABLE:
                new AlertDialog.Builder(MainActivity.this).setTitle("支付成功").setMessage("成功购                        买"+productName).setPositiveButton("确定", null).show();
                    break;
                //授权内容,支付成功
                case ENTITLED:
                new AlertDialog.Builder(MainActivity.this).setTitle("支付成功").setMessage("成功激                        活正版游戏").setPositiveButton("确定", null).show();
                    break;
                //订阅内容,支付成功
                case SUBSCRIPTION:
               
                    break;
                }
                
                break;
            case ALREADY_ENTITLED:
            //已经授权过的,属于成功,此时将道具给玩家即可
               
            break;
            case FAILED:
            Toast.makeText(MainActivity.this, "支付失败", Toast.LENGTH_LONG).show();
               
            break;
            case INVALID_SKU:
            Toast.makeText(MainActivity.this, "无法识别的sku", Toast.LENGTH_LONG).show();
               
            break;
            }
}
@Override
public void onGetUserIdResponse(GetUserIdResponse arg0) {
// TODO Auto-generated method stub
super.onGetUserIdResponse(arg0);
}
@Override
public void onSdkAvailable(boolean arg0) {
// TODO Auto-generated method stub
super.onSdkAvailable(arg0);
}
}
}

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

Android支付接入(八):Amazon亚马逊支付的更多相关文章

  1. 解密:Amazon亚马逊产品Listing关键词刷单排名原理

    第一:基本概念   在阅读正文之前,请先理解下面的几个基本概念.   核心词[高频词.热词.大词.主词]:长度大约1~2个单词构成,指每天搜索量比较多的词,每个行业对高频词的划分不一样,这个主要看自己 ...

  2. 亚马逊CEO贝索斯致股东信:阐述公司未来计划

    亚马逊CEO 杰夫·贝索斯(Jeff Bezos)今天发布年度股东信, 详细描述了亚马逊的产品.服务和未来计划,当然,信中并没有任何的硬数据,比如说亚马逊Kindle的销量等等.但这封信也包括一些颇令 ...

  3. BTC暴涨市值仅次于亚马逊,NGK推出新人助力空投,直接免费送VAST!

    数据显示,在谷歌搜索中,关键词"BTC"的全球搜索指数在过去一周达到满值100点.特斯拉"加持"下,比特币重启暴涨模式,最高报价48126美金单价,非小号数据显 ...

  4. 亚马逊6月18日发布惊世之作 或为3D智能手机

    亚马逊将在 6 月 18 日举行一个产品发布会. 其内容可能是关于传闻已久的亚马逊智能手机.该公司在 YouTube 上公布了一段炫耀这款设备的视频.这段视频展示了很多人在这款产品前摇头晃脑,并且表现 ...

  5. 亚马逊Prime会员的杀价,能说明会员+会越来越便宜吗?

    前段时间,京东又坑了!京东调整了物流方案--从原来的购物不满49元只需6元运费,调整到购物不满46元运费15元,运费猛涨了9元!原本京东PLUS会员每月有5张免运费券,但在运费涨价后运费券限制在6元, ...

  6. [转]Amazon AWS亚马逊云服务免费一年VPS主机成功申请和使用方法

    今天部落将再次为大家介绍如何成功申请到来自亚马逊的Amazon AWS免费一年的VPS主机服务.亚马逊公司这个就不用介绍了,是美国最大的一家网络电子商务公司,亚马逊弹性计算云Amazon EC2更是鼎 ...

  7. Amazon EMR(Elastic MapReduce):亚马逊Hadoop托管服务运行架构&Hadoop云服务之战:微软vs.亚马逊

    http://s3tools.org/s3cmd Amazon Elastic MapReduce (Amazon EMR)简介 Amazon Elastic MapReduce (Amazon EM ...

  8. 在亚马逊amazon的AWS上安装Node和MongoDB服务器

    在亚马逊amazon的AWS上安装Node和MongoDB服务器 在建立AWS上账号.创建EC2 ,用putty链接上之后,就可以用下面的方法开始安装. !!! 如果不是是自己建立的EC2, 而是由B ...

  9. 亚马逊云服务器VPS Amazon EC2 免费VPS主机配置CentOS及其它内容

    Amazon目前提供为期一年的免费VPS服务,可到地址http://aws.amazon.com 进行申请. 现在对账号申请成功后,对VPS主机配置CentOS的过程做个图文介绍 1.创建实例(Ins ...

随机推荐

  1. VC Office2007界面对话框实现

    我们知道VS2008SP1之后,MFC就多了一个功能包,可以快速的建立一个ribbon的界面,视觉样式可以在office 2007蓝.黑等颜色之间切换,这对于单文档/多文档做界面非常方便,而且也蛮好看 ...

  2. 九度OnlineJudge之1017:还是畅通工程

    题目描述:     某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可 ...

  3. Matlab,Visio等生成的图片的字体嵌入问题解决方法

    确保所有字体嵌入,是生成高质量学术论文的必要条件.但是在Windows下,总会遇到Matlab或Visio生成字体没有嵌入的问题,当然这个问题的解决办法有很多(例如,对于Visio可以这样做:直接拷贝 ...

  4. 在SharePoint 2013 中使用文档库Scheduling (计划公布功能)

    本文讲述在SharePoint2013 中使用文档库Scheduling (计划公布功能)的步骤和注意的事项. 文档库Scheduling (计划公布功能) 用于设定当文档通过审批后特定的时间区间内才 ...

  5. PHP学习之-1.1 PHP 可以做什么?

    PHP 可以做什么? 为什么要学习PHP,"我可以用javascript来实现程序的编写."但是javascript的能力是有限的,javascript通常运行在浏览器(客户端), ...

  6. Head First PHP &amp;MySQL学习笔记

      近期一段时间在学习PHP,买了<Head First PHP&MySQL>中文版这本书,之前买过<Head First设计模式>,感觉这系列的书籍整体来说非常不错. ...

  7. EL表达式(2)

    本篇介绍EL表达式的隐式对象,如同JSP一样,EL也封装了11个隐式对象,通过这些隐式对象可以在EL表达式中直接使用. 在使用EL时,其实EL是先看标识符是否是其隐式对象之一,如果不是,才从四个域(p ...

  8. SpringMVC之Controller传递JSON数据到页面

    在Controller中,组装好JSON格式的数据,然后输入到页面,或者通过ajax请求在页面进行解析,都可以做到. 1.Controller /** * JSON DATA TO PAGE VEIW ...

  9. How to find configuration file MySQL uses?(转)

    http://www.dbasquare.com/2012/04/01/how-to-find-mysql-configuration-file/ A customer called me today ...

  10. ZOJ 3829 贪心 思维题

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829 现场做这道题的时候,感觉是思维题.自己智商不够.不敢搞,想着队友智商 ...