zoukankan      html  css  js  c++  java
  • Android下集成Paypal支付

    近期项目需要研究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<PayPalItem> productsInCart = new ArrayList<PayPalItem>();
    
        @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网站上可以查到相应记录:

  • 相关阅读:
    Loading CSS without blocking render
    总结Web应用中基于浏览器的安全漏洞
    React Native通信机制详解
    HTML Imports
    编程语言和它们的创造者
    USB Transfer and Packet Sizes
    灰色心情
    c++ 深入理解虚函数
    在VS2012中采用C++中调用DLL中的函数(4)
    在C++中调用DLL中的函数(3)
  • 原文地址:https://www.cnblogs.com/Fredric-2013/p/4608473.html
Copyright © 2011-2022 走看看