• Paypal支付(一)MPL真正的快捷支付


    一、前导

    前面讲到了MEC支付,是在Web端集成好的,在手机端仅仅需通过WebView进行载入就可以,不须要不论什么Paypal第三方架包。以下将的是MPL支付。须要架包。

    这样的支付的形式能够參考以下的演示:

    https://www.paypal-biz.com/product/demo/product/mobile-payment/index.html

    二、MPL支付案例

    PaymentBean

    package com.example.paypaldemo;
    
    public class PaymentBean {
    	private float unitPrice;
    	private int quantity;
    	private float discount;
    	public float getUnitPrice() {
    		return unitPrice;
    	}
    	public void setUnitPrice(float unitPrice) {
    		this.unitPrice = unitPrice;
    	}
    	public int getQuantity() {
    		return quantity;
    	}
    	public void setQuantity(int quantity) {
    		this.quantity = quantity;
    	}
    	public float getDiscount() {
    		return discount;
    	}
    	public void setDiscount(float discount) {
    		this.discount = discount;
    	}
    	public PaymentBean(float unitPrice, int quantity, float discount) {
    		super();
    		this.unitPrice = unitPrice;
    		this.quantity = quantity;
    		this.discount = discount;
    	}
    	
    }
    

    PizzaMain

    package com.example.paypaldemo;
    /**
     * https://www.paypal-biz.com/product/demo/product/mobile-payment/index.html
     */
    import java.math.BigDecimal;
    import java.text.DecimalFormat;
    import java.util.ArrayList;
    import java.util.List;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Gravity;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.RelativeLayout;
    import android.widget.RelativeLayout.LayoutParams;
    import android.widget.Toast;
    
    import com.paypal.android.MEP.CheckoutButton;
    import com.paypal.android.MEP.PayPal;
    import com.paypal.android.MEP.PayPalActivity;
    import com.paypal.android.MEP.PayPalInvoiceData;
    import com.paypal.android.MEP.PayPalInvoiceItem;
    import com.paypal.android.MEP.PayPalPayment;
    
    public class PizzaMain extends Activity implements OnClickListener {
    	private boolean _paypalLibraryInit;
    	private static final String TAG = "PizzaMain";
    	// APP-80W284485P519543T
    	private CheckoutButton launchPayPalButton;
    	private int PAYPAL_BUTTON_ID = 1341515;
    	private List<PaymentBean> list = new ArrayList<PaymentBean>();;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		initLibrary();
    		showPayPalButton();
    	}
    
    	public void initLibrary() {
    		PayPal pp = PayPal.getInstance();
    		if (pp == null) { // Test to see if the library is already initialized
    
    			// This main initialization call takes your Context, AppID, and
    			// target server
    			pp = PayPal.initWithAppID(this, "APP-80W284485P519543T", PayPal.ENV_NONE);
    			// Required settings:
    
    			// Set the language for the library
    			pp.setLanguage("en_US");
    
    			// Some Optional settings:
    
    			// Sets who pays any transaction fees. Possible values are:
    			// FEEPAYER_SENDER, FEEPAYER_PRIMARYRECEIVER, FEEPAYER_EACHRECEIVER,
    			// and FEEPAYER_SECONDARYONLY
    			pp.setFeesPayer(PayPal.FEEPAYER_EACHRECEIVER);
    
    			// true = transaction requires shipping
    			pp.setShippingEnabled(true);
    
    			_paypalLibraryInit = true;
    		}
    	}
    
    	@Override
    	protected void onResume() {
    		super.onResume();
    		showPayPalButton();
    	}
    
    	private void showPayPalButton() {
    
    		// Generate the PayPal checkout button and save it for later use
    		PayPal pp = PayPal.getInstance();
    		// Paypal按钮类型:CheckoutButton.TEXT_DONATE捐赠,CheckoutButton.TEXT_PAY付款
    		launchPayPalButton = pp.getCheckoutButton(this, PayPal.BUTTON_278x43, CheckoutButton.TEXT_PAY);
    		// The OnClick listener for the checkout button
    		launchPayPalButton.setOnClickListener(this);
    
    		// Add the listener to the layout
    		RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    		params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
    		params.bottomMargin = 10;
    		launchPayPalButton.setLayoutParams(params);
    		launchPayPalButton.setId(PAYPAL_BUTTON_ID);
    		((RelativeLayout) findViewById(R.id.RelativeLayout01)).addView(launchPayPalButton);
    		((RelativeLayout) findViewById(R.id.RelativeLayout01)).setGravity(Gravity.CENTER_HORIZONTAL);
    
    	}
    
    	@Override
    	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    		super.onActivityResult(requestCode, resultCode, data);
    		switch (resultCode) {
    		// The payment succeeded
    		case Activity.RESULT_OK:
    			Toast.makeText(this, "transact successful,has submit infomation to PayPal", Toast.LENGTH_SHORT).show();
    			String payKey = data.getStringExtra(PayPalActivity.EXTRA_PAY_KEY);
    			String transactionID = data.getStringExtra(PayPalActivity.EXTRA_CORRELATION_ID);// 交易号
    			String paymentInfo = data.getStringExtra(PayPalActivity.EXTRA_PAYMENT_INFO);// 交易信息
    			String status = data.getStringExtra(PayPalActivity.EXTRA_PAYMENT_STATUS);// 交易状态
    			Log.e(TAG, "payKey:" + payKey + ",transactionID:" + transactionID + ",paymentInfo" + paymentInfo + ",status" + status);
    			break;
    
    		// The payment was canceled
    		case Activity.RESULT_CANCELED:
    			Toast.makeText(this, "cancle", Toast.LENGTH_SHORT).show();
    			break;
    
    		// The payment failed, get the error from the EXTRA_ERROR_ID and
    		// EXTRA_ERROR_MESSAGE
    		case PayPalActivity.RESULT_FAILURE:
    			Toast.makeText(this, "error", Toast.LENGTH_SHORT).show();
    			String errorID = data.getStringExtra(PayPalActivity.EXTRA_ERROR_ID);
    			String errorMessage = data.getStringExtra(PayPalActivity.EXTRA_ERROR_MESSAGE);
    		}
    	}
    
    	// 点击按钮之后的操作都是在Payment中进行的,也就是在PayActivity中进行的,交易完成后,会返回到当前Activity
    	@Override
    	public void onClick(View arg0) {
    		PayPalPayment payment = new PayPalPayment();
    		// 设置货币种类,默认是USD
    		payment.setCurrencyType("USD");
    		// 收件人信息:email或者phone number
    		payment.setRecipient("admin@chinabuye.com");
    		// 设置物品描写叙述。默觉得空
    		payment.setDescription("");
    		// 显示给买家看的商户名称, 假设没有设置则显示收款方email
    		payment.setMerchantName("ChinaBuye");
    		// 设置付款类型,捐款、个人、商品
    		// PAYMENT_TYPE_SERVICE, PAYMENT_TYPE_PERSONAL, or PAYMENT_TYPE_NONE
    		payment.setPaymentType(PayPal.PAYMENT_TYPE_GOODS);
    		// 交易结果还会调用web远端的一个地址传递交易数据
    		payment.setIpnUrl("http://www...../.../x.php");
    		// 设置交易备注信息,千万别写中文。否则怎么错的都不知道
    		payment.setMemo("Note: please give me the invoice");
    		// PayPalInvoiceData can contain tax and shipping amounts, and an
    		// ArrayList of PayPalInvoiceItem that you can fill out.
    		// These are not required for any transaction.
    		PayPalInvoiceData invoice = new PayPalInvoiceData();
    		// 设置税
    		invoice.setTax(new BigDecimal(2f));
    		list.clear();
    		// 向购物车中加入一个产品
    		PayPalInvoiceItem item1 = new PayPalInvoiceItem();
    		item1.setName("gadget");
    		item1.setID("01");
    		// 单位价格和数量的问题
    		// 这里有个问题。就是价格格式必须xx#.##的形式。否则交易不成功,解决方式參考formatPrice()
    		float unitPrice = 12.22f;
    		int quantity = 2;
    		float discount = 1;
    		PaymentBean bean1 = new PaymentBean(unitPrice, quantity, discount);
    		list.add(bean1);
    		item1.setTotalPrice(formatTotalPrice(unitPrice, quantity, discount));// 单位价格*数量
    		item1.setUnitPrice(formatUnitPrice(unitPrice));// 单位价格
    		item1.setQuantity(2); // 数量
    		invoice.getInvoiceItems().add(item1); // 加入item到购物篮
    
    		// 设置付款金额,不含税和运费
    		payment.setSubtotal(formatSubtotal());
    
    		Intent paypalIntent = PayPal.getInstance().checkout(payment, this);
    		this.startActivityForResult(paypalIntent, 1);
    
    		// 以下这样的方法报错
    		// Intent paypalIntent = new Intent(this, PayPalActivity.class);
    		// paypalIntent.putExtra(PayPalActivity.EXTRA_PAYMENT_INFO, payment);
    		// this.startActivityForResult(paypalIntent, 1);
    	}
    
    	// 格式化付款金额
    	private BigDecimal formatSubtotal() {
    		float subTotal = 0;
    		for (int x = 0; x < list.size(); x++) {
    			PaymentBean bean = list.get(x);
    			subTotal += bean.getQuantity() * bean.getUnitPrice() * bean.getDiscount();
    		}
    		return formatUnitPrice(subTotal);
    	}
    
    	// 格式化单个商品的总价价格
    	private BigDecimal formatTotalPrice(float unitPrice, int quantity, float discount) {
    		DecimalFormat dfm = new DecimalFormat("#.##");
    		float price = unitPrice * discount;
    		BigDecimal big = new BigDecimal(dfm.format(price * quantity));
    		return big;
    	}
    
    	// 格式化单个商品的单位价格
    	private BigDecimal formatUnitPrice(float unitPrice) {
    		DecimalFormat dfm = new DecimalFormat("#.##");
    		BigDecimal big = new BigDecimal(dfm.format(unitPrice));
    		return big;
    	}
    }
    
    项目结构例如以下:



  • 相关阅读:
    pip相关工具使用小结
    PyCharm配置autopep8,自动格式化Python代码
    PyCharm运行Nosetests并导出测试报告
    Jenkins集成taffy进行自动化测试并输出测试报告
    Locust性能测试框架,从入门到精通
    浅谈如何打造一个安全稳定高效的容器云平台
    微服务治理平台的RPC方案实现
    这个需求我不接之事务的自动补偿
    微服务熔断隔离机制及注意事项
    容器化-Docker介绍
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6846640.html
Copyright © 2020-2023  润新知