Android集成java paypal 支付集成支付的问题

来自PayPal的Android手机支付解决方案 -
来自PayPal的Android手机支付解决方案
  大家下午好,我来自PayPal,今天讨论主题是关于PayPal手机支付这一块解决方案。
  众所周知现在基本的付费形式是Android推出的Android
Market,我们开发者只需要上传开发者软件,设定价格,当有人下载就可以获得收入,但是收费渠道只针对欧美少数国家开发,其中不包括中国,中国开发者必须得办一张美国信用卡然后才能得到付款。
  这就意味着可能在美国设一个办事处,或者有人在美国。但是现在针对中国开发者情况,像一些五六个人小团队来说,这可能是一种奢望。有一则好消息,我们PayPal公司在今年5月份发布一个支持Android系统的应用,叫手机支付类库,简称MPL,方便用户在应用程序内向开发者直接付费,并且无需您来核对信用卡相关信息,最大优点应用程序内部直接完成支付。在借款流程上非常简单,从而帮助更多的开发者盈利,回流资金。
  现在开发者可以前期把这个程序作为一种免费形式来下载,后期在功能上进行收费,这样的话给一些用户带来比较好的体验。
在MPL刚发布的时候,很多下载者进行下载,刚刚开始发布的时候,其中多数来自于中国,这说明我们中国开发者对于MPL的需求,PayPal在中国团队每天都在帮助不同的开发者,在他们应用中集成PayPal,淘得人生第一桶金,PayPal让开发者痛快将款项收到自己腰包里,通过PayPal广大用户群体,强有力效应让用户购买我们程序。用户把钱付到PayPal帐户,怎么样把PayPal帐户转到我腰包里,操作上是否方便?
  再介绍一下我们PayPal发展情况,我们PayPal公司98年成立,总部在加利福尼亚州,现在有190个国家,超过两亿注册用户,在很多国家PayPal都是最受欢迎一种付款方式。02年因为易倍有首付款需求所以收购了,现在北京、深圳、上海、广州都有专门办事处,专门客服团队,商务部,技术团队。PayPal结算这块问题我相信操作起来其实真的很方便的,对于中国开发者,我们现在要求非常简单,只要拥有一张建卡,招行借记卡,只需要任何一张银行卡,可以注册PayPal通过认证。收款方只需要用一张银行借记卡可以轻松把PayPal帐户余额转向银行卡。目前支持13家银行,当有用户向PayPal付费的时候,可以轻松从PayPal帐户把余额提现到身边13家银行上。PayPal支付全球24种货币,主流信用卡,银行卡,电子支票,PayPal余额付款,除此之外PayPal中国团队也会给我们开发者提供一个全方位的支持。像先进运营模式,最新的PayPal接口,还有完全的技术支持,包括对心理物品这一块安全销售解决方案,包括一些市场宣传这一块,让我们中国开发者通过PayPal盈利道路更加平坦。
  现在我们PayPal这边的团队已经帮助很多个人开发者,还有团队来盈利,有主办方机锋网,还有搜狐畅游等等都有跟PayPal这边有合作,我们希望有更多的个人或者公司加入我们,成为我们的合作伙伴来一起挣钱,这就是今天主要内容,非常感谢大家聆听,谢谢!
沙龙背景板
讨论移动支付问题
沙龙现场济济一堂
嘉宾围坐一圈各抒己见
开发者踊跃提问Android集成Paypal
最近在项目中原生化支付模块,由于项目是面向美国加拿大用户的,所以需要集成Paypal支付和信用卡支付。本人菜鸟一个,第一次做项目,就被安排完成支付模块,我也是很无语啊,没办法,只能硬着头皮上啊。经过阅读文档,不断测试,最终成功了!!!(鼓掌)
今天主要讲一下信用卡和Paypal支付两部分。
信用卡需要自己定义UI,所以输入信用卡信息都是自己处理。信用卡信息的获取分为手动填写和扫描获取。
1. 手动填写
信用卡账号输入处理:
* 信用卡号每隔四位加入一个空格
private TextWatcher mCreditCardNumWatcher = new TextWatcher() {
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
public void onTextChanged(CharSequence s, int start, int before, int count) {
modifyCardIcon(s.toString().replace(" ", ""));
if (TextUtils.isEmpty(s)) {
boolean isMiddle = (start + count) & (s.length());
boolean isNeedSpace = false;
if (!isMiddle && s.length() & 0 && s.length() % 5 == 0) {
isNeedSpace = true;
if (isMiddle || isNeedSpace || count & 1) {
String newStr = s.toString();
newStr = newStr.replace(" ", "");
StringBuilder sb = new StringBuilder();
for (int i = 0; i & newStr.length(); i += 4) {
if (i & 0) {
sb.append(" ");
if (i + 4 &= newStr.length()) {
sb.append(newStr.substring(i, i + 4));
sb.append(newStr.substring(i, newStr.length()));
mCreditCardNum.removeOnTextChangedListener(this);
mCreditCardNum.setText(sb);
if (!isMiddle || count & 1) {
mCreditCardNum.setSelection(sb.length());
} else if (isMiddle) {
if (count == 0) {
if ((start - before + 1) % 5 == 0) {
mCreditCardNum.setSelection((start - before) & 0 ? start - before : 0);
mCreditCardNum.setSelection((start - before + 1) & sb.length() ? sb.length() : (start - before + 1));
if ((start - before + count) % 5 == 0) {
mCreditCardNum.setSelection((start + count - before + 1) & sb.length() ? (start + count - before + 1) : sb.length());
mCreditCardNum.setSelection(start + count - before);
mCreditCardNum.addOnTextChangedListener(this);
public void afterTextChanged(Editable s) {
信用卡有效期输入处理:
* 有效期的格式为MM/YY
private TextWatcher mCreditCardExpirationDateWatcher = new TextWatcher() {
String beforeTC;
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
beforeTC = s.toString();
public void onTextChanged(CharSequence s, int start, int before, int count) {
String currentInputDesc = "";
if (count != 0) {
String temp = s.toString();
if (temp.length() &= 1) {
currentInputDesc = temp.charAt(temp.length() - 1) + "";
if (ZERO.equals(beforeTC)) {
if (ZERO.equals(currentInputDesc)) {
mCreditCardExpirationDate.setText(ZERO);
mCreditCardExpirationDate.setSelection(ZERO.length());
String aTemp = s.toString() + BACK_SLASH;
mCreditCardExpirationDate.setText(aTemp);
mCreditCardExpirationDate.setSelection(aTemp.length());
if (ONE.equals(beforeTC)) {
if (currentInputDesc.equals(ZERO)
|| currentInputDesc.equals(ONE)
|| currentInputDesc.equals(TWO)) {
String aTemp = ONE + currentInputDesc + BACK_SLASH;
mCreditCardExpirationDate.setText(aTemp);
mCreditCardExpirationDate.setSelection(aTemp.length());
mCreditCardExpirationDate.setText(ONE);
mCreditCardExpirationDate.setSelection(ONE.length());
if (TextUtils.isEmpty(beforeTC)) {
temp = temp.replaceAll("/", "");
if (temp.length() == 1) {
if (!currentInputDesc.equals(ZERO)
&& !currentInputDesc.equals(ONE)) {
String aTemp = ZERO + s.toString() + BACK_SLASH;
mCreditCardExpirationDate.setText(aTemp);
mCreditCardExpirationDate.setSelection(aTemp.length());
} else if (temp.length() & 1) {
String firstChar = temp.charAt(0) + "";
if (!firstChar.equals(ZERO) && !firstChar.equals(ONE)) {
temp = ZERO +
temp = temp.substring(0, 2) + "/" + temp.substring(2, temp.length());
mCreditCardExpirationDate.setText(temp);
if (temp.length() & 5) {
mCreditCardExpirationDate.setSelection(5);
mCreditCardExpirationDate.setSelection(temp.length());
int selectionStart = mCreditCardExpirationDate.getSelectionStart();
int textLength = mCreditCardExpirationDate.getText().length();
if (selectionStart != textLength) {
mCreditCardExpirationDate.setText(beforeTC);
mCreditCardExpirationDate
.setSelection(mCreditCardExpirationDate.getText().length());
mCreditCardExpirationDate.setSelection(s.toString().length());
if (s.length() == 2) {
int index = mCreditCardExpirationDate.getSelectionStart();
Editable editable = mCreditCardExpirationDate.getText();
editable.delete(index - 1, index);
public void afterTextChanged(Editable s) {
2.扫描获取
使用card.io:
Android SDK版本16(Android 4.1)或更高版本。
集成过程:
在你的build.gradle:
compile 'io.card:android-sdk:5.5.1'
首先,我们假设你要从一个按钮启动扫描器,并且已经onClick在布局XML中通过设置按钮的处理器android:onClick=”onScanPress”。然后,添加方法如下:
public void onScanPress(View v) {
Intent scanIntent = new Intent(this, CardIOActivity.class);
scanIntent.putExtra(CardIOActivity.EXTRA_REQUIRE_EXPIRY, true);
scanIntent.putExtra(CardIOActivity.EXTRA_REQUIRE_CVV, false);
scanIntent.putExtra(CardIOActivity.EXTRA_REQUIRE_POSTAL_CODE, false);
startActivityForResult(scanIntent, MY_SCAN_REQUEST_CODE);
接下来,我们将覆盖onActivityResult()获取扫描结果。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == MY_SCAN_REQUEST_CODE) {
String resultDisplayS
if (data != null && data.hasExtra(CardIOActivity.EXTRA_SCAN_RESULT)) {
CreditCard scanResult = data.getParcelableExtra(CardIOActivity.EXTRA_SCAN_RESULT);
resultDisplayStr = "Card Number: " + scanResult.getRedactedCardNumber() + "\n";
if (scanResult.isExpiryValid()) {
resultDisplayStr += "Expiration Date: " + scanResult.expiryMonth + "/" + scanResult.expiryYear + "\n";
if (scanResult.cvv != null) {
resultDisplayStr += "CVV has " + scanResult.cvv.length() + " digits.\n";
if (scanResult.postalCode != null) {
resultDisplayStr += "Postal Code: " + scanResult.postalCode + "\n";
resultDisplayStr = "Scan was canceled.";
信用卡的整个过程还是比较简单的,就不做过多的描述。
今天的重点来了,Paypal支付,废话不多说,直接进入主题。
我们项目中使用的是Braintree支付,这里要来讲一下Braintree和Paypal的区别与联系:
支付网关(Payment Gateway)是在商户的在线商城网站和商户的银行收款账户之间,搭建一个加密的支付信息通道,以便安全地将消费者通过浏览器在网站上购买时所输入的账户信息(如信用卡、姓名等)安全地传输到银行端,并将付款行的授权返回给收款行。Braintree就是支付网关。
支付处理系统(Processor)是链接消费者账户银行和商户收款银行之间的交易系统,确保交易资金可以顺利地从消费者付款行账户进入到商户的收款行账户。Paypal就是支付管理系统。
具体的怎么操作就不用管了,这是他们后台支付的问题。不需要我们来处理。现在来看一下Braintree的支付流程:
客户端向服务器请求Token
服务器生成并发送Token给客户端, 发起支付请求
BrainTree返回支付信息Nonce给客户端
客户端发送Nonce给服务器
收到Nonce后, 服务器带着Nonce去BrainTree进行支付
重点来了,集成:
官方文档:)
SDK要求:Android API &= 16
在你的build.gradle,添加以下内容:
dependencies {
compile 'com.braintreepayments.api:braintree:2.+'
对于PayPal,必须将URL方案定义为接受返回浏览器开关。编辑你AndroidManifest.xml的包含BraintreeBrowserSwitchActivity并设置android:scheme:
android:name="com.braintreepayments.api.BraintreeBrowserSwitchActivity"
android:launchMode="singleTask"&
android:name="android.intent.action.VIEW" /&
android:name="android.intent.category.DEFAULT" /&
android:name="android.intent.category.BROWSABLE" /&
android:scheme="${applicationId}.braintree" /&
设置BraintreeFragment只是一个调用BraintreeFragment.newInstance(activity, authorization)与当前Activity和客户端令牌。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBraintreeFragment = BraintreeFragment.newInstance(this, mAuthorization);
} catch (InvalidArgumentException e) {
这个方法将会:
准备一个BraintreeFragment。
添加BraintreeFragment到给定的活动。
检查给定mAuthorization字符串的有效性。
注册监听事件:
PaymentMethodNonceCreatedListener当a PaymentMethodNonce被成功标记时被调用。从这发送nonce PaymentMethodNonce到你的服务器来创建一个事务。
public void onPaymentMethodNonceCreated(PaymentMethodNonce paymentMethodNonce) {
String nonce = paymentMethodNonce.getNonce();
BraintreeCancelListener在BraintreeFragment被通知Activity#RESULT_CANCELED结果代码时被调用Fragment#onActivityResult。
public void onCancel(int requestCode) {
BraintreeErrorListener在出现错误时调用。ErrorWithResponse在请求发生验证错误时调用。Exception在发生网络问题或服务器错误等错误时引发。
public void onError(Exception error) {
if (error instanceof ErrorWithResponse) {
ErrorWithResponse errorWithResponse = (ErrorWithResponse)
BraintreeError cardErrors = errorWithResponse.errorFor("creditCard");
if (cardErrors != null) {
BraintreeError expirationMonthError = cardErrors.errorFor("expirationMonth");
if (expirationMonthError != null) {
setErrorMessage(expirationMonthError.getMessage());
3.从服务器获取 Client Token
您的服务器负责生成客户端令牌,其中包含您的客户端初始化客户端SDK所需的授权和配置详细信息。
从您的服务器请求客户端令牌,然后初始化Braintree并提供下拉式UI(本示例使用从服务器请求客户端令牌 - 适应您自己的设置):
AsyncHttpClient client = new AsyncHttpClient();
client.get("https://your-server/client_token", new TextHttpResponseHandler() {
public void onSuccess(int statusCode, Header[] headers, String clientToken) {
this.clientToken = clientT
4.Paypal 配置
一次性结账是使用PayPal创建单个交易的简单方法。首先,确保你已经定义了你的URL方案。然后,PayPal.requestOneTimePayment用来开始这个过程。一个示例集成可能如下所示:
public void setupBraintreeAndStartExpressCheckout() {
PayPalRequest request = new PayPalRequest("1")
.currencyCode("USD")
.intent(PayPalRequest.INTENT_AUTHORIZE);
PayPal.requestOneTimePayment(mBraintreeFragment, request);
支付事件的监听:
yourButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
setupBraintreeAndStartExpressCheckout();
当您收到回拨时onPaymentMethodNonceCreated,您可以查询PayPalAccountNonce您返回的对象以获取特定的客户信息。
public void onPaymentMethodNonceCreated(PaymentMethodNonce paymentMethodNonce) {
String nonce = paymentMethodNonce.getNonce();
5.发送Nonce到服务器
将生成的付款方式随机数发送到您的服务器:
void postNonceToServer(String nonce) {
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("payment_method_nonce", nonce);
client.post("http://your-server/checkout", params,
new AsyncHttpResponseHandler() {
好吧,整个流程完了。开始的时候不了解,踩了很多坑。国内也没有完整的教程,所以就自己做的过程整理了一下。第一次写,写的不好,请大家多多包涵。
没有更多推荐了,
不良信息举报
举报内容:
Android集成Paypal
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!没有更多推荐了,
不良信息举报
举报内容:
Android集成PayPal支付
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!没有更多推荐了,
不良信息举报
举报内容:
Android集成Google支付,以及遇到的坑、坑
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!Paypal集成问题_百度知道
Paypal集成问题
需要回答两个URL和用户名的格式分别是什么?
我有更好的答案
你好我是pp顾问,你说的这个情况我们有专门技术部门的技术支持的哦。或者也可以看哈我博客整理的一些资料你看能帮到你不。
采纳率:11%
为您推荐:
其他类似问题
您可能关注的内容
paypal的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 paypal集成 的文章

 

随机推荐