android 应用中加入支付功能(支付宝集成)

注意事项
1.添加android.permission.INTERNET权限和android.permission.ACCESS_NETWORK_STATE权限
2.代码中出现注释的地方重点看,没注释的地方能够不看
3.想获取支付宝合做商户ID,及支付宝公钥请点击支付宝连接,生成密钥及PKCS8转码工具在文档中
java

1.下载官方架包和说明文档android

到支付宝官网https://b.alipay.com/order/techService.htm?channel=psl下载(快捷支付(无线))开发包,咱们主要是用到 WS_SECURE_PAY_SDK\客户端demo\Android_SDK 目录下的alipay.jar 和 WS_SECURE_PAY_SDK\客户端demo\Android_SDK\alipay_sdk_demo\assets下的alipay_msp.apk,这两个文件是咱们不能修改的支付宝api和安装包。api

2. 商户签约安全

3.密钥配置服务器

4.引用jar和包含安装包
    (1).新建android工程;
    (2).copy上面说的alipay.jar到工程的libs目录下,并在java build path中经过Add External JARs找到并引用该jar;
    (3).copy上面说的alipay_msp.apk安装包到assets目录下,后面配置路径用到。工具

5.调用代码整理
   http://blog.csdn.net/simdanfeg/article/details/9011603ui

1、       支付宝平台的集成this

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

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

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

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

2.  对订单信息进行签名

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

4.  调用pay方法。

主要流程图以下:

支付接口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%。      

相关文章
相关标签/搜索