Android集成支付宝支付功能示例

公司项目中需要支付功能,现在支付宝、微信支付很方便,也很多人使用,因此,他们是首选。在此记录一下支付宝集成过程,下期为微信支付,敬请期待

首先去支付宝官网下载其最新的Android的SDK集成Dmeo

支付宝

选择SDK&Dmeo进行下载

将支付宝jar包添加项目中

alipaySdk-20160516.jar

可以看到其主要的调用方法在PayDemoActivity类中,下面为主要支付调用方法:

    /**
     * 完整的符合支付宝参数规范的订单信息
     */
    final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();

    Runnable payRunnable = new Runnable() {

      @Override
      public void run() {
        // 构造PayTask 对象
        PayTask alipay = new PayTask(PayDemoActivity.this);
        // 调用支付接口,获取支付结果
        String result = alipay.pay(payInfo, true);

        Message msg = new Message();
        msg.what = SDK_PAY_FLAG;
        msg.obj = result;
        mHandler.sendMessage(msg);
      }
    };

    // 必须异步调用
    Thread payThread = new Thread(payRunnable);
    payThread.start();

注意,我们需要异步发支付请求。可以看到他仅仅需要我们 传递好参数

完整的符合支付宝参数规范的订单信息

这一步,我公司由服务器返回已经处理好的秘钥,我直接传递给支付宝即可

代码如下:

partner="2088101568358171"&seller_id="xxx@alipay.com"&out_trade_no="0819145412-6177"&subject="测试"&body="测试测试"&total_fee="0.01"&notify_url="http://notify.msp.hk/notify.htm"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&sign="lBBK%2F0w5LOajrMrji7DUgEqNjIhQbidR13GovA5r3TgIbNqv231yC1NksLdw%2Ba3JnfHXoXuet6XNNHtn7VE%2BeCoRO1O%2BR1KugLrQEZMtG5jmJIe2pbjm%2F3kb%2FuGkpG%2BwYQYI51%2BhA3YBbvZHVQBYveBqK%2Bh8mUyb7GM1HxWs9k4%3D"&sign_type="RSA"

请求后,我们讲获得返回值result

代码如下:

resultStatus={9000};memo={};result={partner="2088101568358171"&seller_id="xxx@alipay.com"&out_trade_no="0819145412-6177"&subject="测试"&body="测试测试"&total_fee="0.01"&notify_url="http://notify.msp.hk/notify.htm"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&success="true"&sign_type="RSA"&sign="hkFZr+zE9499nuqDNLZEF7W75RFFPsly876QuRSeN8WMaUgcdR00IKy5ZyBJ4eldhoJ/2zghqrD4E2G2mNjs3aE+HCLiBXrPDNdLKCZgSOIqmv46TfPTEqopYfhs+o5fZzXxt34fwdrzN4mX6S13cr3UwmEV4L3Ffir/02RBVtU="}

错误码

  1. 9000 -> 订单支付成功
  2. 8000 -> 正在处理中
  3. 4000 -> 订单支付失败
  4. 6001 -> 用户中途取消
  5. 6002 ->网络连接出错

回调处理

@SuppressLint("HandlerLeak")
  private Handler mHandler = new Handler() {
    @SuppressWarnings("unused")
    public void handleMessage(Message msg) {
      switch (msg.what) {
      case SDK_PAY_FLAG: {
        PayResult payResult = new PayResult((String) msg.obj);
        /**
         * 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc.open.alipay.com/doc2/
         * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
         * docType=1) 建议商户依赖异步通知
         */
        String resultInfo = payResult.getResult();// 同步返回需要验证的信息

        String resultStatus = payResult.getResultStatus();
        // 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
        if (TextUtils.equals(resultStatus, "9000")) {
          Toast.makeText(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
        } else {
          // 判断resultStatus 为非"9000"则代表可能支付失败
          // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
          if (TextUtils.equals(resultStatus, "8000")) {
            Toast.makeText(PayDemoActivity.this, "支付结果确认中", Toast.LENGTH_SHORT).show();

          } else {
            // 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
            Toast.makeText(PayDemoActivity.this, "支付失败", Toast.LENGTH_SHORT).show();

          }
        }
        break;
      }
      default:
        break;
      }
    };
  };

至此Android客户端集成支付宝已经完成,是不是So easey!

上面是支付宝Demo的代码,我自己写的时候做了优化,毕竟我们集成的支付插件不仅仅只有支付宝,因此需要写一个统一支付pay,在此基础上做好相应的封装,方便后续的拓展,在此说下我的封装思路。

  1. 新建一个IPay借口,里面仅仅只有pay方法
  2. 新建一个Pay实现IPay,重写pay方法,实现支付功能,在Pay里面,统一做网络请求操作,如需要从服务器获取==完整的符合支付宝参数规范的订单信息==,微信一样需要这样,因此可以在此类中统一做请求,获得返回值之后,根据调用支付类型,执行相应pay方法。
  3. 当然也可以建立一个PayHelper 专门用于实现各个支付类型的pay方法,然后在Pay中调用,减少代码量
  4. 我们要新建一个IPayResultCallBack接口,定义onSuccess、onFail方法,表示支付成功失败的回调
  5. 新建一个抽象类PayResultCallBack实现IPayResultCallBack,讲onSuceess、onFail放到支付成功/失败相应中,表明支付成功、失败回调方法,到时调用pay方法是,即要传递实现好的回调类对象

支持基本一个可拓展的支付功能基本搭建完成,剩余的仅仅是需要一个一个集成其他支付功能,走的路子任然如此,一个pay,然后回调方法里面处理支付结果!!!

1、IPay

/**
* 支付接口
* Created by kingpeng on 16/5/19.
*/
public interface IPay {
 void pay(int payType,String orderInfo);
}

2、Pay

/**
* 支付工具类
* Created by kingpeng on 16/5/19.
*/
public class Pay implements IPay {
 private Activity mContext;
 private MyCallback mCallback = new MyCallback();
 private int mPayType;
 private PayHelper mPayHelper;
 private IPayResultCallback mPayResultCallback;

 public Pay(Activity context, IPayResultCallback payResultCallback) {
   mContext = context;
   mPayResultCallback = payResultCallback;
   mPayHelper = new PayHelper();
 }

 @Override
 public void pay(int payType, String orderInfo) {
   mPayType = payType;
   ReqParam param = new ReqParam();
   param.setAlertProgressDialog(mContext, true);
   param.put("orderInfo", orderInfo);
   param.put("payway", payType);
   RequestUtil.getInstance().postApi3(R.string.payment_app_require, param, mCallback);
 }

 /**
  * 支付宝支付
  *
  * @param payInfo
  */
 private void aliPay(final String payInfo) {
   mPayHelper.aliPay(mContext, payInfo, mPayResultCallback);
 }
 private class MyCallback extends ReqCallbackIml {
   @Override
   public void onSuccess(int action, String response) {
     switch (action) {
       case R.string.payment_app_require:
         PayParseBean bean = (PayParseBean) GsonUtil.jsonToBean(response, PayParseBean.class);
         if (bean != null && bean.errcode == 0) {
           switch (mPayType) {
             case 1:
               //请求支付宝
               aliPay(bean.signStr);
               break;
             case 2:
               //ToDo 请求微信
               break;
           }
         } else {
           ToastUtils.showDefaultToastCenter(mContext.getApplicationContext(), "获取订单信息失败");
         }
         break;
     }
   }

   @Override
   public void onFail(int action, Throwable e) {
     ToastUtils.showDefaultToastCenter(mContext.getApplicationContext(), "获取订单信息失败");
   }
 }

3、PayHelper

/**
* 支付帮助类
* Created by kingpeng on 16/5/19.
*/
public class PayHelper {
 public PayHelper() {
 }

 /**
  * 支付宝支付
  *
  * @param activity
  * @param payInfo
  */
 public void aliPay(Activity activity, String payInfo, IPayResultCallback payResultCallback) {
   new AlipayTask(activity, payInfo, payResultCallback).execute();
 }

 private class AlipayTask extends AsyncTask<String, Integer, String> {
   private Activity mContext;
   private String mPayInfo;
   private IPayResultCallback mPayResultCallback;

   public AlipayTask(Activity context, String payInfo, IPayResultCallback payResultCallback) {
     super();
     mContext = context;
     mPayInfo = payInfo;
     mPayResultCallback = payResultCallback;
   }

   @Override
   protected String doInBackground(String... params) {
     // 构造PayTask 对象
     PayTask alipay = new PayTask(mContext);
     // 调用支付接口,获取支付结果
     String result = alipay.pay(mPayInfo, true);
     return result;
   }

   @Override
   protected void onPostExecute(String result) {
     mPayResultCallback.payResult(result, Constants.PAY_ALIPAY);
   }
 }

4、PayResultCallbackImpl

/**
* 支付结果回调
* Created by kingpeng on 16/5/19.
*/
public abstract class PayResultCallbackImpl implements IPayResultCallback {
 public void payResult(String result, int payType) {
   switch (payType) {
     case Constants.PAY_ALIPAY:
       aliPayResult(result, payType);
       break;
     case Constants.PAY_WX:
       wxPayResult(result, payType);
       break;
   }

 }
 /**
  * 支付宝支付结果
  *
  * @param result
  * @param payType
  */
 private void aliPayResult(String result, int payType) {
   PayResult payResult = new PayResult(result);
   /**
    * 同步返回的结果必须放置到服务端进行验证(验证的规则请看https://doc.open.alipay.com/doc2/
    * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
    * docType=1) 建议商户依赖异步通知
    */
   String resultInfo = payResult.getResult();// 同步返回需要验证的信息
   String resultStatus = payResult.getResultStatus();
   // 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
   if (TextUtils.equals(resultStatus, "9000")) {
     onPaySuccess(result, payType);
   } else {
     // 判断resultStatus 为非"9000"则代表可能支付失败
     // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
     // 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
     onPayFail(result, payType);
   }
 }

 /**
  * 支付成功
  *
  * @param result
  * @param payType
  */
 public abstract void onPaySuccess(String result, int payType);

 /**
  * 支付失败
  *
  * @param result
  * @param payType
  */
 public abstract void onPayFail(String result, int payType);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 新版Android studio导入微信支付和支付宝官方Demo问题解决大全

    最近项目要用到支付宝支付和微信支付,本想使用第三方支付框架ping++或者BeeCloud的,但是由于他们的收费问题,让我望而却步,而且公司给了相应的公钥.私钥和APPID等,所以就用下开放平台的呗. 进去倒腾了半天才发现一堆问题,Oh,我的天.完全不知所云,百度谷歌了一堆,都没找到足够的解决方案.好吧,自己来,这里也就把相关的东西分享给大家,如果有类似问题的可以考虑使用一下,不足的地方大牛就别喷了. 微信开放平台有文档和SDK,大家可以去自己查看下载,火箭:https://open.weixi

  • Android支付宝支付设计开发

    在移动支付领域,支付宝支付占用巨大份额,根据艾瑞咨询公布的报告数据:2014Q3,支付宝斩获了82.6%的市场份额,在移动支付的霸主地位越来越稳固.财付通支付的发力点在微信支付和手Q支付,在移动支付格局中取得了10.0%的市场份额,排名第二. 支付宝在移动支付领域的统治地位,使得我们有必要梳理支付宝移动开发流程.本文写作的目的就是梳理支付流程,从架构层面讲述如何在移动应用中嵌入支付宝支付功能,以及指出哪些地方存在开发陷阱. 准备       按照说明,首先需要申请支付宝支付账号.这方面根据网站说

  • Android支付宝和微信支付集成

    场景 随着移动支付的兴起,在我们的app'中,会经常有集成支付的需求.这时候一般都会采用微信和支付宝的sdk 来集成 (一)支付宝支付 在使用支付宝支付的过程中,我们是在服务器端生成订单,客户端访问接口,并得到订单信息,调用接口支付,支付成功后支付宝会分别 异步调用服务器端,并向客户端返回支付结果. 开发步骤: ①注册支付宝账号--进行实名认证--提交审核资料--审核通过 支付宝无线快捷支付接口: b.alipay.com/order/productDetail.htm?productId=20

  • Android支付宝支付开发实例

    在移动应用满天飞的时代,随着移动支付的盛行,很多应用中都集成了支付功能.之前的支付一直不是我负责,近期这个项目我负责订单模块少不了要做支付,每每提起支付就觉得怕怕,觉得很难,但当真正做的时候却远远没有想象中的那么难.支付宝的SDK提供了demo,我们只需要配置好一些基本信息,这个demo就可以正常支付.说了这么多,我们还是来看看完整的集成步骤吧! 1.首先得申请支付宝的商家用户,并签约支付宝的相关服务. 移动支付肯定是需要签约 移动支付 了,好像是废话. 2.支付宝商家账号有了之后就好办了,去支

  • Android集成支付宝支付功能示例

    公司项目中需要支付功能,现在支付宝.微信支付很方便,也很多人使用,因此,他们是首选.在此记录一下支付宝集成过程,下期为微信支付,敬请期待 首先去支付宝官网下载其最新的Android的SDK集成Dmeo 支付宝 选择SDK&Dmeo进行下载 将支付宝jar包添加项目中 alipaySdk-20160516.jar 可以看到其主要的调用方法在PayDemoActivity类中,下面为主要支付调用方法: /** * 完整的符合支付宝参数规范的订单信息 */ final String payInfo =

  • springboot 集成支付宝支付的示例代码

    最简单的springboot集成支付宝 1 注册沙箱 沙箱是一个模拟环境登录,百度蚂蚁金服开放平台,支付宝扫码登录如下 然后沙箱需要注册一下,非常之简单,注册好以后进入到如下页面,选沙箱工具,然后下载一个生成密钥的工具.然后解压按照里面的readme生成公私密钥, 选择沙箱应用 上传公钥即可..沙箱到这里就基本完成了,里面还有沙箱版本的的android app可以下载下来. java 程序 1 新建一个springboot项目 因为我们创建的是一个web工程,所以,仅仅演示支付宝的demo,只需

  • PHP实现的支付宝支付功能示例

    本文实例讲述了PHP实现的支付宝支付功能.分享给大家供大家参考,具体如下: 在给app做支付宝支付接口的时候收集内容整理如下: 接口: import('alipay.AopClient', EXTEND_PATH); import('alipay.request.AlipayTradeAppPayRequest', EXTEND_PATH); $aop = new \AopClient(); $aop->gatewayUrl = "https://openapi.alipay.com/ga

  • Android集成微信支付功能

    准备工作这里就不说了,包括签约和申请APPID,附上微信开放平台APP开发步骤,不懂的同学可以参考这里: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5 上面的步骤很详细,这里主要说下调起支付的注意事项.按照上面文档中说的商户服务器生成支付订单,先调用统一下单API生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付. 相关代码如下: /** * 商户服务器生成支付订单,先调用统一下单API(详见第

  • Android支付宝支付的示例代码

    上一篇,我们已经详细讲解了Android微信支付,今天接着为大家带来支付宝支付,支付宝支付相对微信支付要简单一些,吐槽一下,而且支付宝文档确实比微信的文档好了不少,下面开始讲解支付流程. 1.首先给出官方文档的地址 Android集成支付宝流程 2.在开始集成和开发前,首先了解一下常用的接入方式和架构建议: 支付流程.png 在开始下一步之前,给大家看看网上的很多操作. 网上的代码.png 这一大堆代码,后面还有,百来行吧,而且支付宝Demo貌似也是这么干的,估计一些新司机就有点懵逼了,至于吗?

  • Java spring boot 实现支付宝支付功能的示例代码

    一.准备工作: 1.登陆支付宝开发者中心,申请一个开发者账号. 地址:https://openhome.alipay.com/ 2.进入研发服务: 3.点击链接进入工具下载页面: 4.点击下载对应版本的RSA公钥生成器: 5.生成公钥密钥(记录你的应用私钥): 6.在支付宝配置公钥(点击保存): 二.搭建demo 1.引入jia包: <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alip

  • SpringMVC+Spring+Mybatis实现支付宝支付功能的示例代码

    本博客详细介绍了如何使用ssm框架实现支付宝支付功能.本文章分为两大部分,分别是「支付宝测试环境代码测试」和「将支付宝支付整合到ssm框架」,详细的代码和图文解释,自己实践的时候一定仔细阅读相关文档. 教程源代码:https://github.com/OUYANGSIHAI/sihai-maven-ssm-alipay 一.支付宝测试环境代码测试: 1.下载电脑网站的官方demo以及查看参考相关文档: 地址:https://docs.open.alipay.com/270/106291/ 2.下

  • Android实现微信支付功能详解

    1.集成微信支付SDK: 在build.gradle中,添加如下依赖 compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+' 2.设置微信支付回调页面: 路径:项目包名.wxapi 名称:WXPayEntryActivity public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler { private IWXAPI api; @

  • IOS 集成微信支付功能的实现方法

    IOS 集成微信支付功能的实现方法 第一步:集成微信的SDK https://pay.weixin.qq.com/wiki/doc/api/index.html 点击进入 下载对应SDK或示例,最后可以看看示例程序 第二步:在Xcode中填写微信开放平台申请的Appid Xcode>info>URL Types  中新建加入Appid 第三步:在Appdelegate.m 中注册微信支付 和回调 #import "WXApi.h" 添加 代理 WXApiDelegate -

  • 详解java集成支付宝支付接口(JSP+支付宝20160912)

    吐槽一下: 支付宝的接口和微信的DEMO和文档真心太难看懂了,乱七八糟,都不知道去哪里找自己要的东西,最近几天我们公司需要做类似的开发,我作为先锋,率先解决Java集成支付宝支付和微信支付接口工作. 我们的工作环境:JSP网站+支付接口,目前工作的支付宝接口为20160912,微信为V3版本,如遇到版本升级,请联系相关机构的客户服务人员升级. 本文介绍JSP+支付宝接口,本文非原创. 新手注意: 1.本文使用的接口地址和参数为沙箱的地址,无论你在使用沙箱或者正式地址,务必核实使用接口地址和参数,

随机推荐