为了支持海外的支付,我真的是找遍了各种方法,研究过google支付,最后因为手续费太高放弃。最后还是找到了支付宝海外支付。
sdk文档地址:http://www.alipay-seller.mpymnt.com/node/82(对,只有英文文档,没有中文)
该渠道支持的visa、mastercard、jcb等信用卡,既然是信用卡支付,是有一定的失败概率的,没有开通国际汇款的信用卡不能支付(这个目前我们应用测试结果是这样子的)。
国内的信用卡不能支付,不管是双币还是其他(这个很忧伤)。我在测试环境测试好后,只能麻烦海外用户帮忙测试。。。
下面我把基本步骤给贴出来,还有一些注意事项。
开发前的准备工作
申请注册webhook http://www.alipay-seller.mpymnt.com/node/35《--这里有说明
按照文档说,发送申请邮件到指定邮箱,在发之前,最好跟支付宝技术人员先联系上,说明想接入他们这个sdk。否则人家看到你发的邮件都不知道是多久以后了。
webhook的作用:主要是通知我们的服务端,支付结果。
1、选择下载哪个demo
官方网站有三个demo(mCommerce Sample App、CheckoutScreens Sample App、Tokenization Sample),我接入的是第一个,
第二个放入我们工程会报错,第三个支付宝技术人员说不要用(我就想既然建议不要用,为何要有)。
下面我说的,就是按照demo里面的代码该注意的地方重点说明。
下面的这个两个参数,测试环境下就按照官方给的值,不用改。在正式环境中,建议吧这两个值放在服务端。
在测试环境中.初始化initializaProvider(PWProviderMode.TEST,
APPLICATIONIDENTIFIER, PROFILETOKEN); 正式环境中记得改成PWProviderMode.LIVE.
创建订单,
这里我选择的是美元收款,文档里面可以有多种收款币种选择的。最后支付宝会结算成人民币给我们。信用卡类型,我总共就用两个visa和mastercard。两种充值类型逻辑都是一样的,唯一的区别就是这个PWCreditCardType.VISA还是PWCreditCardType.MASTERCARD.根据自己的需求。
创建订单后要选择对订单中哪些数据进行风控。这个风控系统是支付宝自己的系统,主要判断订单的风险性,他们自己有套过滤标准。
这个demo里面绝对没有,除非后面更新了。
这里的美元单位是要美分的
设置订单号:
paymentParams.setCustomIdentifier(orderNum+"");
发起注册预授权(pa)
_binder.createAndRegisterPreauthorizationTransaction(paymentParams);
在回调函数creationAndRegistrationSucceeded中
发起pa:
_binder.preauthorizeTransaction(transaction);
pa成功后,注册cp:
_binder.createAndRegisterCaptureTransaction(paymentParams, transaction.getMobileIdentifier());
注册cp成功,发起cp:
_binder.captureTransaction(transaction);
完整的java 代码如下:
public class ProcessTransactionActivity extends Activity implements
PWTransactionListener{ //,PWTransactionStatusListener
private PWProviderBinder _binder;
private String APPLICATIONIDENTIFIER = null;//"payworks.sandbox";
private String PROFILETOKEN = null;//"20d5a0d5ce1d4501a4826a8b7e159d19";
private ServiceConnection _serviceConnection = null;
private PWPaymentParams paymentParams = null;
private PWTransaction transaction = null;
private RelativeLayout ry_btn_back,ry_btn_next;
private TextView tv_title,tv_tips;
private EditText edt_name,edt_cardNumber,edt_cvvNumber,edt_mm,edt_yyyy,edt_emailAddress;
private TextView btn_submit;
private Dialog waitDlg;
private RechargeCoinType coinType;
private int fromWhere = 0;
private String orderNum = "0"; //订单号
private String clientIPAddress = ""; //客户端的ip地址
private boolean isOperating = false;
private int clickPayWay = 0;
private final static int aplipayClientPay = 1;
private final static int aplipayWebPay = 2;
private final static int visaPay = 3;
private final static int masterCardPay = 4;
private TextView textTips;
private void setStatusText(final String string) {
runOnUiThread(new Runnable() {
public void run() {
if (textTips == null) {
textTips = ((TextView) findViewById(R.id.textView1));
}
textTips.setText(string);
}
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_processtransaction);
Bundle bundle = this.getIntent().getExtras();
if (bundle != null) {
fromWhere = bundle.getInt("fromWhere");
PROFILETOKEN = bundle.getString("profiletoken");//可以根据自己的设计获取
APPLICATIONIDENTIFIER = bundle.getString("applicationidentifier");//可以根据自己的设计获取
orderNum = bundle.getString("ordernum");
clientIPAdd