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

  • 支付宝支付
  • 微信支付
  • 银联支付
  • 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教程 第十课 】MongoDB 备份

    MongoDB 数据转储 创建备份MongoDB中的数据库,应该使用mongodump命令.此命令将服务器的所有数据转储到转储目录.有许多可供选择,通过它可以限制的数据量或创建备份您的远程服务器. 语 ...

  2. 【转载】企业服务总线Enterprise service bus介绍

    企业服务总线(Enterprise service bus). 以往企业已经实现了很多服务, 构成了面向服务的架构,也就是我们常说的SOA. 服务的参与双方都必须建立1对1 的联系,让我们回顾一下SO ...

  3. 【转载】HTTP协议与WEB本质

    当你在浏览器地址栏敲入"http://www.csdn.net/",然后猛按回车,呈现在你面前的,将是csdn的首页了(这真是废话,你会认为这是理所当然的).作为一个开发者,尤其是 ...

  4. web 开发之js---页面缓存, jsp 缓存, html 缓存, ajax缓存,解决方法

    有关页面缓存问题.这个问题上网找了好多.但发觉各种解决方法,都彼此分离,没有一篇统一的解决方法,本人近日,也遇到了页面缓存的问题,根据网上各页面缓存的解答,做了一个总结. 1.服务器端缓存的问题, 防 ...

  5. Android 4.4.2 动态加入JNI库方法记录 (二 app应用层)

    欢迎转载,务必注明出处:http://blog.csdn.net/wang_shuai_ww/article/details/44458553 源代码下载地址:http://download.csdn ...

  6. fscanf()函数详解【转】

    本文转载自:http://blog.csdn.net/liangxanhai/article/details/8026496 以前解析有规律的文件的时候要么用正则表达式,要么就是傻傻的自己写程序来解析 ...

  7. HDU1054 Strategic Game —— 最小点覆盖 or 树形DP

    题目链接:https://vjudge.net/problem/HDU-1054 Strategic Game Time Limit: 20000/10000 MS (Java/Others)     ...

  8. YTU 2437: C++ 习题 比较大小-类模板

    2437: C++ 习题 比较大小-类模板 时间限制: 1 Sec  内存限制: 128 MB 提交: 1144  解决: 805 题目描述 声明一个类模板,利用它分别实现两个整数.浮点数和字符的比较 ...

  9. 闲得蛋疼,JavaScript版本BadApple

    参考Vim版本的BadApple改写而成.由于加载数据比较大,可能网速不给力的童鞋效果不太好,多刷新几次就好了,^_^.运行环境:支持HTML5 Canvas的浏览器.​1. 代码:$(functio ...

  10. 【OpenFOAM】——OpenFOAM入门算例学习

    1  明确目标——为啥费老大劲儿学习OpenFOAM 学习OpenFOAM主要出于课题需要,希望实现以下几个目标: l  [ ]学会用SnappyHexMesh生成高质量网格: l  [ ]学习使用O ...