学习笔记-支付宝支付接入

来源:互联网 发布:.php打开乱码怎么解决 编辑:程序博客网 时间:2024/06/05 07:49

          移动支付成为大众生活的一种方式,以支付宝支付和微信这两大主流支付为主,各种移动应用也基本要支持这两类支付,本文就分享博主在接入这两类支付的过程,在作为自己经验的积累之余,也希望能帮到这方面遇到困难的朋友,希望大家都能不断进步.

一. 支付宝支付功能接入

     其实,支付宝支付集成真的很简单; 对这个一脸懵逼的朋友,还是先建议去蚂蚁金服开放平台看一遍说明文档,至少得看一遍,然后下个demo ,按照demo 上来做基本上都没问题,蚂蚁金服APP支付Android接入指南;

这里,我还是简单写一下我的集成过程,申请APPID 和生成秘钥这里就不介绍了;

先去下载最新版的SDK,放在libs 目录下, 目前基本上都是采用新版的SDK 了,官网的态度是希望老版本SDK用户更换成新版;  在manifest里面配置好权限,在获取到秘钥之后,上传你的应用公钥(私钥加密,公钥解密), 主要支付流程代码如下:

  /** 支付宝支付业务:入参app_id */    public static final String APPID = PayKeys.APPID;    /** 支付宝账户登录授权业务:入参pid值 */    public static final String PID = "";    /** 支付宝账户登录授权业务:入参target_id值 */    public static final String TARGET_ID = "";    /** 商户私钥,pkcs8格式 */    /** 如下私钥,RSA2_PRIVATE 或者 RSA_PRIVATE 只需要填入一个 */    /** 如果商户两个都设置了,优先使用 RSA2_PRIVATE */    /** RSA2_PRIVATE 可以保证商户交易在更加安全的环境下进行,建议使用 RSA2_PRIVATE */    /** 获取 RSA2_PRIVATE,建议使用支付宝提供的公私钥生成工具生成, */    /** 工具地址:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=106097&docType=1 */    public static final String RSA2_PRIVATE = PayKeys.PRIVATE;    public static final String RSA_PRIVATE = "";    private static final int SDK_PAY_FLAG = 1;    @SuppressLint("HandlerLeak")    private Handler mHandler = new Handler() {        @SuppressWarnings("unused")        public void handleMessage(Message msg) {            switch (msg.what) {                case SDK_PAY_FLAG: {                    @SuppressWarnings("unchecked")                    PayResult payResult = new PayResult((Map<String, String>) msg.obj);                    /**                     对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。                     */                    String resultInfo = payResult.getResult();// 同步返回需要验证的信息                    Log.d("wr***", "resultInfo="+resultInfo);                    String resultStatus = payResult.getResultStatus();                    // 判断resultStatus 为9000则代表支付成功                    if (TextUtils.equals(resultStatus, "9000")) {                        // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。                        Toast.makeText(ChoosePayWayActivity.this, "支付成功", Toast.LENGTH_SHORT).show();                                 } else {                        // 该笔订单真实的支付结果,需要依赖服务端的异步通知。                        Toast.makeText(ChoosePayWayActivity.this, "支付失败", Toast.LENGTH_SHORT).show();                    }                    break;                }                default:                    break;            }        };    };    /**     * 支付宝支付业务     */    public void pay(final String order) {        if (TextUtils.isEmpty(APPID) || (TextUtils.isEmpty(RSA2_PRIVATE) && TextUtils.isEmpty(RSA_PRIVATE))) {            new AlertDialog.Builder(this).setTitle("警告").setMessage("需要配置APPID | RSA_PRIVATE")                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {                        public void onClick(DialogInterface dialoginterface, int i) {                            //                            finish();                        }                    }).show();            return;        }        /**         * 这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成;         * 真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成;         * 防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险;         *         * orderInfo的获取必须来自服务端;         */        boolean rsa2 = (RSA2_PRIVATE.length() > 0);        Map<String, String> params = OrderInfoUtil2_0.buildOrderParamMap(APPID, rsa2);        String orderParam = OrderInfoUtil2_0.buildOrderParam(params);        String privateKey = rsa2 ? RSA2_PRIVATE : RSA_PRIVATE;        String sign = OrderInfoUtil2_0.getSign(params, privateKey, rsa2);        final String orderInfo = orderParam + "&" + sign;        Runnable payRunnable = new Runnable() {            @Override            public void run() {                PayTask alipay = new PayTask(ChoosePayWayActivity.this);                Map<String, String> result = alipay.payV2(order, true);                Log.i("msp", result.toString());                Message msg = new Message();                msg.what = SDK_PAY_FLAG;                msg.obj = result;                mHandler.sendMessage(msg);            }        };        Thread payThread = new Thread(payRunnable);        payThread.start();    }

其实代码根本不需要那么多,因为隐私部分信息都放在后台,咱们前端只是拿数据放到对应的地方就行了,从代码里面可以看到,咱们要做的就是把orderinfo替换一下, 这个是后台直接给你, 因为订单数据的加签过程不允许放在客户端,所以你只需要把你从服务器拿到的 订单信息替换掉 demo 里面的 orderInfo 就行了, 然后在上面的handler 支付成功消息收到后 作你自己的操作就行了 ,在支付的过程中有时候会遇到一些状态提示码,这个可以去官网上查,都有对应的提示.  如果支付不成功,下面这几个往往就是最容易出问题的地方.

public static final String APPID//合作身份者id,以2088开头的16位纯数字 此id用来支付时快速登录public static final String DEFAULT_PARTNER//收款支付宝账号public static final String DEFAULT_SELLER//商户私钥,自助生成,在压缩包中有openssl,用此软件生成商户的公钥和私钥,写到此处要不然服务器返回错误。公钥要传到淘宝合作账户里详情请看淘宝的sdk文档public static final String  PRIVATE//公钥public static final String PUBLIC