银联在线和支付宝,android应用怎么调用

 我来答
huanglenzhi
推荐于2016-03-14 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517198
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
  一、 支付宝平台的集成

  在技术集成之前,商户需要在https://ms.alipay.com进行注册,并签约安全支付服务。签约成功后可获取支付宝分配的合作商户ID(PartnerID),账户ID(SellerID),调用接口时使用。

  支付细节的实现,主要通过支付宝提供的一个支付安全服务安装包alipay_plugin_20120428msp.apk,首次使用,首先检查是否安装此插件,没有会提示安装。具体的支付细节,在这个插件内完成。大部分的支付平台也都是采用的这种方式。

  调用支付宝的接口进行支付,主要有以下几个步骤

  1. 将商户ID,收款帐号,外部订单号,商品名称,商品介绍,价格,通知地址封装成订单信息

  2. 对订单信息进行签名

  3. 将订单信息,签名,签名方式封装成请求参数

  4. 调用pay方法。

  主要流程图如下:

  支付接口pay方法的调用如下:

  。。。

  // start pay for this order.

  // 根据订单信息开始进行支付

  try {

  // prepare the order info.

  // 准备订单信息

  String orderInfo = getOrderInfo(position);

  // 这里根据签名方式对订单信息进行签名

  String signType = getSignType();

  String strsign = sign(signType, orderInfo);

  Log.v("sign:", strsign);

  // 对签名进行编码

  strsign = URLEncoder.encode(strsign);

  // 组装好参数

  String info = orderInfo + "&sign=" + "\"" + strsign + "\"" + "&"

  + getSignType();

  Log.v("orderInfo:", info);

  // start the pay.

  // 调用pay方法进行支付

  MobileSecurePayer msp = new MobileSecurePayer();

  boolean bRet = msp.pay(info, mHandler, AlixId.RQF_PAY,this);

  

  if (bRet) {

  // show the progress bar to indicate that we have started

  // paying.

  // 显示“正在支付”进度条

  closeProgress();

  mProgress = BaseHelper.showProgress(this,null, "正在支付",false,

  true);

  } else

  ;

  } catch (Exception ex) {

  Toast.makeText(AlixDemo.this, R.string.remote_call_failed,

  Toast.LENGTH_SHORT).show();

  }

  。。。

  /**

  * 向支付宝发送支付请求

  *

  * @param strOrderInfo

  * 订单信息

  * @param callback

  * 回调handler

  * @param myWhat

  * 回调信息

  * @param activity

  * 目标activity

  * @return

  */

  public boolean pay(final String strOrderInfo,final Handler callback,

  final int myWhat, final Activity activity) {

  if (mbPaying)

  return false;

  mbPaying = true;

  

  //

  mActivity = activity;

  

  // bind the service.

  // 绑定服务

  if (mAlixPay ==null) {

  // 绑定安全支付服务需要获取上下文环境,

  // 如果绑定不成功使用mActivity.getApplicationContext().bindService

  // 解绑时同理

  mActivity.getApplicationContext().bindService(

  new Intent(IAlixPay.class.getName()),mAlixPayConnection,

  Context.BIND_AUTO_CREATE);

  }

  // else ok.

  

  // 实例一个线程来进行支付

  new Thread(new Runnable() {

  public void run() {

  try {

  // wait for the service bind operation to completely

  // finished.

  // Note: this is important,otherwise the next mAlixPay.Pay()

  // will fail.

  // 等待安全支付服务绑定操作结束

  // 注意:这里很重要,否则mAlixPay.Pay()方法会失败

  synchronized (lock) {

  if (mAlixPay ==null)

  lock.wait();

  }

  

  // register a Callback for the service.

  // 为安全支付服务注册一个回调

  mAlixPay.registerCallback(mCallback);

  

  // call the MobileSecurePay service.

  // 调用安全支付服务的pay方法

  String strRet =mAlixPay.Pay(strOrderInfo);

  BaseHelper.log(TAG,"After Pay: " + strRet);

  

  // set the flag to indicate that we have finished.

  // unregister the Callback, and unbind the service.

  // 将mbPaying置为false,表示支付结束

  // 移除回调的注册,解绑安全支付服务

  mbPaying = false;

  mAlixPay.unregisterCallback(mCallback);

  mActivity.getApplicationContext().unbindService(

  mAlixPayConnection);

  

  // send the result back to caller.

  // 发送交易结果

  Message msg = new Message();

  msg.what = myWhat;

  msg.obj = strRet;

  callback.sendMessage(msg);

  } catch (Exception e) {

  e.printStackTrace();

  

  // send the result back to caller.

  // 发送交易结果

  Message msg = new Message();

  msg.what = myWhat;

  msg.obj = e.toString();

  callback.sendMessage(msg);

  }

  }

  }).start();

  

  return true;

  }

  

  调用了支付服务之后,有两种方式返回交易结果:

  1. 支付结果作为接口返回的字符串返回。返回的参数包含在result字符串中,具体再进行解析。

  2. 支付宝服务器通知。商户需要提供一个http协议的接口,包含在参数里传递给安全支付,即notify_url。支付宝服务器在支付完成后,会用POST方法调用notufy_url,以xml为数据格式传输支付结果。需要注意的是,商户服务器收到支付宝发的通知之后,需要返回一个纯字符串“success”,不然支付宝的服务器会持续调用七次回调url提供的接口。

  集成需要的交易费用方面0-1万元内是2.5%的费率,1-10万是2.4%,10-100万是2.2%,100万以上2.0%。
  PS :亲测

  AliPayInfo aliPayInfo=new AliPayInfo();
  AliPay aliPay=new AliPay((Activity)OtherPayDlg.this.mContext, mHandler);
  aliPay.pay(aliPayInfo.toString());
  OtherPayDlg.this.dismiss();

  出现问题一:按照说明文档导入alipay.jar 出现AliPay 找不到,然后项目根目录下新建一个 libs文件夹,把要加的包放到这个目录下,右键 Build Path -> Use as source folder

  成功可以引用,但是没有弹出界面

  

  二、 财付通平台的集成

  财付通的集成和支付宝的非常相似(腾讯的传统?→_→)。财付通也是提供了一个财付通安全支付服务应用TenpayService.apk用于处理交易的细节。对于此支付应用,财付通和支付宝的使用方式是一样的。一种是捆绑预置,即打包在assets目录下,另一种是放到自己的服务器中,通过检查更新的方式动态加载。实际集成中可采用二者结合方式,初次使用使用预置apk,之后检查更新动态下载。

  但是调用支付接口之前,增加了一个获取tokenid的过程,tokenid用于同财付通service进行交互。过程如下:

  1. 用户在商户APP 选择商品,使用财付通支付

  2. 商户APP向商户server 请求使用财付通支付

  3. 商户server按照“支付初始化接口”的要求组织数据请求财付通“支付初始化接口”,接收初始化成功后返回的tokenid

  4. 商户server将生成的tokenid 返回给商户APP

  5. 商户APP使用tokenid 调用财付通支付service

  6. 财付通支付service 在验证tokenid 后向用户展示支付中心,显示订单信息及相关用户信息

  7. 用户在支付中心输入支付密码执行支付

  8. 财付通支付service 向财付通后台server 请求执行支付,并实时接收支付结果

  9. 支付成功后财付通支付service 向用户展示支付成功UI,在用户点击“返回商户网站”后回调商户App

  10. 财付通后台server 在支付成功后会通过“支付成功通知接口”在后台通知商户server 支付状态。

  接收支付接口返回结果方面,财付通对于方法返回值,不是直接返回的,而是通过handler回调,handler和msgId作为一个参数传入接口,支付接口pay()方法的返回值只是个true false,用于区分调用成功或者失败。其实跟淘宝的方式大同小异。对于notify_url,是财付通是通过get方式调用回调url,只返回支付成功的订单。同样的,商户服务器在接收到财付通的调用之后,需要返回纯字符串“success”“fail”表示处理成功或失败。

  调用支付接口的代码如下:

  //构造支付参数

  HashMap<String, String> payInfo = new HashMap<String, String>();

  payInfo.put("token_id",mTokenId); //财付通订单号token_id

  payInfo.put("bargainor_id","1234567890"); //财付通合作商户ID,此为演示示例

  // payInfo.put("order_type", "1");

  payInfo.put("caller","com.tenpay.android.appDemo");

  

  //去支付

  tenpayHelper.pay(payInfo,mHandler, MSG_PAY_RESULT);

  财付通的服务费率是1%,另外有相关的套餐可以优惠。

  三、 易宝支付平台集成

  与支付宝和财付通不同的是,易宝集成时,并没有提供一个支付应用apk,只有一个jar包。是一个library project。因为在集成时,需要在manifest文件里面声明支付页面的activity。同时在调用支付页面时,需要用startActivityForResult方式进入,支付结果会通过onActivityResult方法返回。易宝同样支持服务端回调,但比较纠结的是,易宝的服务端回调url,不能在代码中传入,需要在易宝的网站进行配置。只有支付成功时才会触发此回调,以get方式调用。

  调用支付接口的代码如下:其中customerNumber参数是签约之后才能获取到的。requestId为调用方自定义的订单流水号。

  private void startPay(String customerNumber, String chennal) {

  String amount = etAmount.getText().toString();

  String productName = etProductName.getText().toString();

  String productDesc = etProductDesc.getText().toString();

  

  if(TextUtils.isEmpty(productName) || TextUtils.isEmpty(amount)) {

  Toast.makeText(YeepayExampleActivity.this,"", Toast.LENGTH_SHORT);

  }

  

  Intent intent = new Intent(getBaseContext(), YeepayPlugin.class);

  intent.putExtra("customerNumber", customerNumber);

  

  Random random = new Random();

  String time = "" + System.currentTimeMillis();

  String requestId = time + random.nextInt() % 10000;

  

  intent.putExtra("requestId", requestId);

  intent.putExtra("amount", amount);

  intent.putExtra("productName", productName);

  intent.putExtra("time", time);

  intent.putExtra("productDesc", (productDesc ==null) ? "" : productDesc);

  intent.putExtra("support", chennal);

  intent.putExtra("environment","ENV_TEST" );

  StringBuilder builder = new StringBuilder();

  builder.append(CUSTOMER_NUMBER).append("$");

  builder.append(requestId).append("$");

  builder.append(amount).append("$");

  builder.append(productName).append("$");

  builder.append(time);

  

  String hmac = YeepayUtils.hmacSign(builder.toString(),KEY);

  

  Log.e("YeepayExampleActivity","hmac" + hmac);

  

  intent.putExtra("hmac", hmac);

  startActivityForResult(intent, 200);

  }

  易宝集成后的费率需要和易宝的客户经理面谈决定

  四、 银联在线支付集成

  银联的支付应用同支付宝和财付通相同,采用的是独立apk的方式提供服务。调用支付接口采用的startActivity的方式,相关参数通过bundle传递,调用示例如下:

  bundle.putBoolean(USE_TEST_MODE,true);

  

  bundle.putString(SP_ID,"0009");

  bundle.putString(SECURITY_CHIP_TYPE,null);

  bundle.putString(SYS_PROVIDE,"00000001");

  bundle.putString(PAY_DATA, payData);

  …

  Intent startIntent = new Intent();

  // startIntent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);

  startIntent.putExtras(bundle);

  startIntent.setClassName(UPPayUtils.PACKAGE_NAME,

  UPPayUtils.ACTIVITY_NAME);

  // activity.startActivityForResult(startIntent, UPPayUtils.STARTE_UPPAY);

  activity.startActivity(startIntent);

  与以上三种支付平台不同的是,银联支付接口的返回值是通过广播的形式发送的。不支持商户服务端的回调url。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式