近期项目需要研究paypal支付,官网上的指导写的过于复杂,可能是老外的思维和中国人不一样吧。难得是发现下面这篇文章:

http://www.androidhive.info/2015/02/android-integrating-paypal-using-php-mysql-part-1/

在这篇文章的基础上,查看SDK简化了代码,给出下面这个例子,测试通过。

其实集成paypal还是非常简单的,真正的输入账户、付款都在SDK自带的Activity和service上完成,我们要做的事情,是从自己的Activity跳转过去,跳转的同时带一个Payment参数(即付款明细),Paypal SDK处理完后,会回到你的Activity(此时已经完成支付)。

在上面提到的那篇文章中,流程是这样的:

 

这里服务端通过Android端传回的paymentID(类似流水号),获取支付明细判断是否为正确单据。但要注意的是此时支付已经完成,在实际应用中(根据官网SDK)的说法,主要是卡流程的下一步,比如物流发货。

 

在编写代码前要准备如下:

1、在https://developer.paypal.com中注册一个开发账号(通常是卖家),这个账号提供一个客户ID和密码,需要写在代码里,买家实际上是支付到客户ID和密码生成的账户;

2、在上面这个页面下,Paypal提供了沙盒功能,通过沙盒你可以虚拟一个买家账号,供测试所用;

3、新建一个Android工程,在里面整合android paypal的SDK;

备注:根据我实际的操作,eclipse没法导入该jar包,会一直提示没有定义的类,可能是因为SDK是由Gradle构建的原因。在stackoverflow上说用android studio不会出现类似问题,我本地是用的IDEA,也一样OK。

 

下面把主要代码附带如下,之前要注意在manifest中增加权限和SDK中涉及的Activity和Service。

public class MyActivity extends Activity {    private static final String TAG = "MainActivity";    private Button button;    private static final int REQUEST_CODE_PAYMENT = 1;    private static PayPalConfiguration paypalConfig = new PayPalConfiguration()            .environment(PayPalConfiguration.ENVIRONMENT_SANDBOX)            .clientId(Config.PAYPAL_CLIENT_ID);    private List productsInCart = new ArrayList();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        button = (Button) findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            public void onClick(View v) {                addToCart(new Product("1", "sinny", "fredric_sinny", null, new BigDecimal(1), "1232131"));                PayPalPayment thingsToBuy = prepareFinalCart();                Intent intent = new Intent(MyActivity.this,                        PaymentActivity.class);                intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, paypalConfig);                intent.putExtra(PaymentActivity.EXTRA_PAYMENT, thingsToBuy);                startActivityForResult(intent, REQUEST_CODE_PAYMENT);            }        });    }    private PayPalPayment prepareFinalCart() {        PayPalItem[] items = new PayPalItem[productsInCart.size()];        items = productsInCart.toArray(items);        // Total amount        BigDecimal subtotal = PayPalItem.getItemTotal(items);        // If you have shipping cost, add it here        BigDecimal shipping = new BigDecimal("0.0");        // If you have tax, add it here        BigDecimal tax = new BigDecimal("0.0");        PayPalPaymentDetails paymentDetails = new PayPalPaymentDetails(                shipping, subtotal, tax);        BigDecimal amount = subtotal.add(shipping).add(tax);        PayPalPayment payment = new PayPalPayment(                amount,                Config.DEFAULT_CURRENCY,                "Description about transaction. This will be displayed to the user.",                PayPalPayment.PAYMENT_INTENT_SALE);        payment.items(items).paymentDetails(paymentDetails);        payment.custom("This is text that will be associated with the payment that the app can use.");        return payment;    }    public void addToCart(Product product) {        PayPalItem item = new PayPalItem(product.getName(), 1,                product.getPrice(), Config.DEFAULT_CURRENCY, product.getSku());        productsInCart.add(item);        Toast.makeText(getApplicationContext(),                item.getName() + " added to cart!", Toast.LENGTH_SHORT).show();    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        PaymentConfirmation confirm = data                .getParcelableExtra(PaymentActivity.EXTRA_RESULT_CONFIRMATION);        String paymentId;        try {            paymentId = confirm.toJSONObject().getJSONObject("response")                    .getString("id");            String payment_client = confirm.getPayment().toJSONObject()                    .toString();            Log.e(TAG, "paymentId: " + paymentId + ", payment_json: "                    + payment_client);        } catch (JSONException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

其他:

1、后台的接口都是标准的REST的接口,我例子里没有实现,但要注意的是node的SDK包在windows7下是不可用的,好像是里面一个CRC的包不支持,在Linux下没问题。

2、该程序运行后,会跳转到Paypal界面,你可以用沙盒里注册的虚拟买家账号登陆消费,消费完后在paypal网站上可以查到相应记录:

 

更多相关文章

  1. 修改android4.2系统源码实现system组和root用户访问sd卡
  2. Android(安卓)类代码防止反编译的办法
  3. [置顶] Android中的DI(依赖注入)框架--RoboGuice
  4. Android(安卓)contentResolver 进行query 条件为where in时出错
  5. 使用Kotlin Android(安卓)Extensions
  6. Android核心程序之SystemUI - (一)开篇
  7. Android(安卓)MVP模式 谷歌官方代码解读
  8. 第一个android 程序的学习心得
  9. Android(安卓)代码中设置EditText只输入数字、字母

随机推荐

  1. Android中对Handle机制的理解
  2. android 设置布局动画
  3. Android(安卓)ListView 去除边缘阴影、选
  4. Android开发从入门到精通(项目案例版)——
  5. Android(安卓)2.0 平台的亮点
  6. android TextView selector点击样式改变
  7. android 更新版本号
  8. Android(安卓)ProgressBar控件理解
  9. 【Android(安卓)界面效果14】RelativeLay
  10. Android学习笔记-界面和数据存储以及一些