最近做一个项目用到Paypal支付,官网上有集成文档,但是感觉有点复杂,我再这里把步骤优化一下,方便大家集成!
Paypal 的支付流程很简单,我们把钱支付到商家paypal成功以后,paypal会返回给我们一个支付ID,我们拿着支付ID传给服务器,服务器进行验证(确定客户是否支付完成),验证成功后,这个支付就成功了。
首先注册Paypal商家账号,注册完成后登录 https://developer.paypal.com/
我们会看到下面的菜单栏有这一项,
点击My Apps 我们可以在这里面创建APP,APP创建成功以后,我们就可以获得一个Client ID 和Secret,这个很重要哦!在代码里面要用到的,并且这个ID又两个,一个是测试(sandbox)用的,一个是开发(live)环境用的。
在里面我们还需要申请测试账号,在里面可以分配虚拟货币,给我们测试用,步骤就不介绍啦,有问题可以留言咨询哈!
下面我们看一下如何集成到代码里面
我们可以参考github上的Demo https://github.com/paypal/PayPal-Android-SDK
1:在项目的gradle里面配置
compile 'com.paypal.sdk:paypal-android-sdk:2.15.2'
2:初始化配置
private static PayPalConfiguration config = new PayPalConfiguration()
// 测试环境(ENVIRONMENT_SANDBOX)
// 正式(ENVIRONMENT_PRODUCTION)
.environment(PayPalConfiguration.ENVIRONMENT_NO_NETWORK)//这里用的是虚拟环境,在没有clientId的时候用这个。
.clientId("");//这里要填我们创建APP的时候给的clientId
//注意:这里的ID有两套,一个是测试用的,对应的上面environment就是 ENVIRONMENT_SANDBOX。两个不能用乱了。
3:启动Paypal服务,并且在onDestroy时停止服务。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this, PayPalService.class);
intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config);
startService(intent);
}
@Override
public void onDestroy() {
stopService(new Intent(this, PayPalService.class));
super.onDestroy();
}
4:创建支付,进入支付页面
public void onBuyPressed(View pressed) {
// PAYMENT_INTENT_SALE 将导致支付立即完成。.
// Change PAYMENT_INTENT_SALE to
// - PAYMENT_INTENT_AUTHORIZE to only authorize payment and capture funds later.
// - PAYMENT_INTENT_ORDER to create a payment for authorization and capture
// later via calls from your server.
PayPalPayment payment = new PayPalPayment(new BigDecimal("1.75"), "USD", "sample item", PayPalPayment.PAYMENT_INTENT_SALE);
Intent intent = new Intent(this, PaymentActivity.class); // send the same configuration for restart resiliency
intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config);
intent.putExtra(PaymentActivity.EXTRA_PAYMENT, payment);
startActivityForResult(intent, 0);}
5:实现支付回调
@Override
protected void onActivityResult (int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
PaymentConfirmation confirm = data.getParcelableExtra(PaymentActivity.EXTRA_RESULT_CONFIRMATION);
if (confirm != null) {
try {
Log.i("paymentExample", confirm.toJSONObject().toString(4));
// TODO:这里我们可以拿到confirm,里面有个id我们需要把这个id传给我们自己的服务器,然后服务器进行验证。
} catch (JSONException e) {
Log.e("paymentExample", "an extremely unlikely failure occurred: ", e);
}
}
}
else if (resultCode == Activity.RESULT_CANCELED) {
Log.i("paymentExample", "The user canceled.");
}
else if (resultCode == PaymentActivity.RESULT_EXTRAS_INVALID) {
Log.i("paymentExample", "An invalid Payment or PayPalConfiguration was submitted. Please see the docs.");
}
}
6:服务端验证
我们拿到支付ID后,传给服务器,服务器会验证客户是否支付成功。当然,服务端也是需要集成Paypal的代码,进行验证的。
7:最后mainfests
到这一步以及算是完成了支付了,下面说说我再集成的时候遇到的问题吧!
1:我再创建APP的时候摸索了很久,网上也找了一些资料,但是都不这么详细,大家有问题可以邮箱给我哈![email protected]
2:账号问题,我再进行沙盒测试的时候,测试通过。但是一切换的正式(live)环境的就不行,原因是我们国内的paypal不能用,我的解决办法是,办一张信用卡,开通国际支付,然后注册一个国外的paypal账户,用信用卡绑定的paypal给国外的paypal转钱过去,然后用国外的paypal支付,这样就OK了。
上面集成的Paypal支付里面还包含了信用卡的支付,如果单纯的就集成Paypal支付,还有简单方法哦!
在这个里面 https://repo1.maven.org/maven2/com/paypal/sdk/paypal-android-sdk/ 下载一个最新的aar文件,然后放进项目的lib目录里面。然后我们就可以去掉gradle里面的依赖了。代码和上面的一样。
好啦!大家如果有什么问题,可以留言或者邮箱哈,我会尽量帮大家解决。