常见的第三方支付解决方案

  • 支付宝支付
  • 微信支付
  • 银联支付
  • Ping++统一支付平台(需要继承服务器端和客户端)
  • 短信支付

支付宝的集成流程

  • 首先,支付宝支付准备工作

    • 首先登录【支付宝开放平台】http://open.alipay.com/platform/home.htm,创建应用,并给应用添加App支付功能
    • 由于App支付功能需要签约,因此需要上传公司信息和证件等资料进行签约
    • 签约成功后,需要配置秘钥。使用支付宝提供的工具生成RSA公钥和私钥(工具下载地址),公钥需要设置到管理后台,具体操作请登录官网
  • 第二步,拼接符合支付宝规范的请求参数,主要有以下几点:

    • 先拼接订单信息,如下:

      Map<string, string=""> params = OrderInfoUtil2_0.buildOrderParamMap(APPID, rsa2);
      String orderParam = OrderInfoUtil2_0.buildOrderParam(params);
    • 然后并对订单信息使用私钥进行RSA加密,并拼接订单信息:

      String sign = OrderInfoUtil2_0.getSign(params, privateKey, rsa2);
      final String orderInfo = orderParam + "&" + sign;
    • 但是,上面的2个步骤,由于涉及到私钥加密,如果写在本地容易暴露私钥,所以一般会让服务器提供一个提交确认订单的接口,客户端将订单相关参数传递给服务器,服务器负责拼接支付宝的请求参数,然后返回给客户端,所以上面的步骤其实不用我们来做。
  • 第三步,调用支付api,传入请求参数进行支付请求:

    // 构造PayTask 对象
    PayTask alipay = new PayTask(PayDemoActivity.this);
    Map<string, string=""> result = alipay.payV2(orderInfo, true);
  • 最后,接收支付结果,根据支付状态进行UI提示:

    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(); }
    }

微信支付的集成流程

整体步骤可以说,和支付宝一致的

详情查看:
1.微信商户接入准备工作
2.微信支付sdk开发文档 
3.微信支付sdk详细流程

  • 首先,获取符合微信支付规范的请求参数,demo中是通过一个url获取的,这告诉我们,应该让服务器提供一个接口,来对订单信息进行加密然后返回。代码如下:

    String url = "http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=android";
    byte[] buf = Util.httpGet(url);
  • 第二步,对请求参数进行封装:

    PayReq req = new PayReq();
    //req.appId = "wxf8b4f85f3a794e77"; // 测试用appId
    req.appId = json.getString("appid");
    req.partnerId = json.getString("partnerid");
    req.prepayId = json.getString("prepayid");
    req.nonceStr = json.getString("noncestr");
    req.timeStamp = json.getString("timestamp");
    req.packageValue = json.getString("package");
    req.sign = json.getString("sign");
    req.extData = "app data"; // optional
  • 第三步,调用支付api,传入请求参数:

    // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
    api.sendReq(req);
  • 最后,接收支付结果,根据状态码进行UI提示,此处在demo中是在WXPayEntryActivity中进行操作的。

    public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
    private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
    private IWXAPI api;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.pay_result);
    api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);
    api.handleIntent(getIntent(), this);
    }
    @Override
    protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
    api.handleIntent(intent, this);
    }
    @Override
    public void onReq(BaseReq req) {
    }
    @Override
    public void onResp(BaseResp resp) {
    if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(R.string.app_tip);
    builder.setMessage(getString(R.string.pay_result_callback_msg, String.valueOf(resp.errCode)));
    builder.show();
    }
    }
    }

银联支付的集成流程

银联支付最简单,只要有TN(交易流水号)即可发起支付!

详情查看:
1.银联支付开发者平台首页
2.银联手机支付资料下载页

  • 首先,当要进行支付时,调用自己服务器提供的接口获取流水号,即TN,代码类似这样:

    String tn = HttpHelper.execGet("tn_url");
  • 然后,拿到TN后,调用银联SDK的api向银联发起支付请求,代码类似这样:

    //其中mode参数解释: "00" - 启动银联正式环境 "01" - 连接银联测试环境
    
    UPPayAssistEx.startPay(activity, null, null, tn, mode);
  • 最后,在onActivityResult方法中获取支付结果进行UI提示,代码类似这样:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    /*************************************************
    * 步骤3:处理银联手机支付控件返回的支付结果
    ************************************************/
    if (data == null) {
    return;
    } String msg = "";
    /*
    * 支付控件返回字符串:success、fail、cancel 分别代表支付成功,支付失败,支付取消
    */
    String str = data.getExtras().getString("pay_result");
    if (str.equalsIgnoreCase("success")) { // 如果想对结果数据验签,可使用下面这段代码,但建议不验签,直接去商户后台查询交易结果
    // result_data结构见c)result_data参数说明
    if (data.hasExtra("result_data")) {
    // 结果result_data为成功时,去商户后台查询一下再展示成功
    //注意,此处只是表示客户端收到了支付成功的响应。但是为了保险起见,需要向服务器查询一下是否真的支付功。
    //具体做法是,让自己服务器提交一个查询订单状态的接口,如果服务器返回的结果也是支付成功,那么就真的提示用户
    }
    msg = "支付成功!";
    } else if (str.equalsIgnoreCase("fail")) {
    msg = "支付失败!";
    } else if (str.equalsIgnoreCase("cancel")) {
    msg = "用户取消了支付";
    } //进行UI提示
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("支付结果通知");
    builder.setMessage(msg);
    builder.setInverseBackgroundForced(true);
    // builder.setCustomTitle();
    builder.setNegativeButton("确定", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();
    }
    });
    builder.create().show();
    }

Android中集成第三方支付的更多相关文章

  1. Android中集成第三方库的方法和问题

    Android中集成第三方库的方法和问题 声明: 1. 本文參考了网上同学们的现有成果,在此表示感谢,參考资料在文后有链接. 2. 本文的重点在第三部分,是在开发中遇到的问题及解决的方法.第一,第二部 ...

  2. 【转】Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解决办法)

    原文网址:http://www.blogjava.net/anchor110/articles/355699.html 1.在工程下新建lib文件夹,将需要的第三方包拷贝进来.2.将引用的第三方包,添 ...

  3. InstallShield安装包中集成第三方安装包的方案选择

    原文:InstallShield安装包中集成第三方安装包的方案选择[转]   我们在制作安装包时,有些情况下会涉及第三方安装的集成,这里将讨论如何调用安装第三方包,以及需要注意的事项. 第三方安装包的 ...

  4. Ionic2中集成第三方控件Sweetalert

    Ionic2混合开发,入坑系列:Ionic2中集成第三方控件Sweetalert 注:Sweetalert2已经可以直接从npm中下载安装 npm install --save sweetalert2 ...

  5. Android中集成ffmpeg(一):编译ffmpeg

    方案选择 Android中集成ffmpeg的codec功能无非两种方式: JNI直接调用,主要用于App开发(无权限修改系统底层),如EXOPlayer,JPlayer等. 集成ffmpeg到OMX, ...

  6. APP中的第三方“支付”功能测试建议

    目前市场上APP中带有支付功能的产品有非常多,那么APP中带有第三方支付功能的产品在这一模块该如何测试才尽可能的确保测试完整性. 正常流程: 正常使用支付宝.微信.银行卡(目前使用最多的第三方支付方式 ...

  7. android app 集成 支付宝支付 微信支付

    项目中部分功能点需要用到支付功能,移动端主要集成支付宝支付和微信支付 支付宝sdk以及demo下载地址:https://doc.open.alipay.com/doc2/detail.htm?spm= ...

  8. Android中集成支付宝

    手机的在线支付,被认为是2012年最看好的功能,我个人认为这也是移动互联网较传统互联网将会大放光彩的一个功能. 人人有手机,人人携带手机,花钱买东西,不再需要取钱付现,不再需要回家上网银,想买什么,扫 ...

  9. InstallShield安装包中集成第三方安装包的方案选择[转]

      我们在制作安装包时,有些情况下会涉及第三方安装的集成,这里将讨论如何调用安装第三方包,以及需要注意的事项. 第三方安装包的介质类型有很多,主要有:单独的一个Setup.exe,单独的一个msi包, ...

随机推荐

  1. 最简单实用的MongoDB安装教程:在CentOS中使用 yum 安装MongoDB及服务器端配置详解

    一.准备工作: 运行yum命令查看MongoDB的包信息 [root@vm ~]# yum info mongo-10gen (提示没有相关匹配的信息,) 说明你的centos系统中的yum源不包含M ...

  2. vs2010下配置CUDA出现kernel launch failed问题,内核无效

    首先, 推荐一篇不错的配置文档~手把手教你 CUDA 5.5与VS2010编译环境的搭建.笔者就是在这篇文章的指导下成功地在VS2010上搭建了CUDA 6.5~ 其次. 文末给出的执行演示样例不好使 ...

  3. Linux(Ubuntu14.04)下Google Chrome / Chromium标题栏乱码问题

    注:我使用的Linux发行版是Ubuntu 14.04,不同Linux发行版可能会有不同. 最近在使用Chromium的时候tab的标题栏中文显示乱码,在地址栏输入中文是同样时乱码,就像下图: 看起来 ...

  4. Memory Analysis环境安装

    安装MAT(MAT在eclipse的页面:http://www.eclipse.org/mat/downloads.php) 显示饼图的时候,需要安装BIRT Chart Engine插件,通过Ins ...

  5. 基于开源项目的在线网络视频直播项目---pc端的推流

    https://github.com/winlinvip/simple-rtmp-server/issues/66 https://github.com/justinmakaila/iOS-Frame ...

  6. Cocos2d-x 3.2 Lua演示样例CurrentLanguageTest(当前语言环境)

    Cocos2d-x 3.2 Lua演示样例CurrentLanguageTest(当前语言环境) 转载请注明:IT_xiao小巫 本篇博客介绍Cocos2d-x 3.2给我们提供的一个样例.获取当前程 ...

  7. [IT学习]GIT 学习

    最近开始了解GIT.有一些不错的资源记录在下面: 1.GIT for teams A book about teams cooperation. 2.GIT https://learngitbranc ...

  8. jquery loop on Json data using $.each

    Hi I have the following JSON returned in a variable called data. THIS IS THE JSON THAT GETS RETURNED ...

  9. vue 生命周期钩子 过滤器 计算属性

    每一个Vue实例在被创建之前都要经过一系列的初始化过程.例如,实例需要配置数据观测.编译模板.挂载实例到DOM,然后在数据变化时更新DOM,在这个过程中,实例也会调用一些生命周期钩子,这就给我们提供了 ...

  10. JSP+MySQL实例

    转自:https://www.yiibai.com/jsp/jsp_mysql.html 在本章中,我们将讨论如何使用JSP访问数据库(这里以MySQL数据库为例).并假设您对JDBC应用程序的工作方 ...