支付

一、微信支付

0.

1.在微信支付平台上的 应用签名 必须和现在的应用签名一致,应用签名是否一致的主要因素是包名和keystore文件。(微信平台上有校验签名的工具)

2.依赖:

compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'

3.注册APPID

 IWXAPI msgApi = WXAPIFactory.createWXAPI(this, Contants.WX_Appid, false);
 msgApi.registerApp(Contants.WX_Appid);(Contants.WX_Appid代表APPID)

4.

    boolean isPaySupported = msgApi.getWXAppSupportAPI() >= Build.PAY_SUPPORTED_SDK_INT;
        if (isPaySupported) {
            //data  根据服务器返回的json数据创建的实体类对象
            PayReq request = new PayReq();
            request.appId = data.getAppid();
            request.partnerId = data.getPartnerid();
            request.prepayId = data.getPrepayid();
            request.packageValue = data.getPackages();
            request.nonceStr = data.getNoncestr();
            request.timeStamp = String.valueOf(data.getTimestamp());
            request.extData = "app data"; // optional
            request.sign = data.getSign();
            isPay = true;
            boolean b = msgApi.sendReq(request);
           
        } else {
            Toast.makeText(mContext, "当前微信版本不支持支付", Toast.LENGTH_SHORT).show();
        }

5.创建一个包名为wxapi的文件夹,在包里创建一个WXPayEntryActivity类,在类里写上微信支付的回掉,

6.在WXPayEntryActivity类中实现IWXAPIEventHandler接口,在onResp方法中写上

     if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            int code = baseResp.errCode;
            switch (code) {
                case 0:
                    Toast.makeText(mContext, "支付成功", Toast.LENGTH_SHORT).show();
                    break;
                case -1:
                    Toast.makeText(mContext, "支付失败", Toast.LENGTH_SHORT).show();
                    break;
                case -2:
                    Toast.makeText(mContext, "支付取消", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    Toast.makeText(mContext, "支付失败", Toast.LENGTH_SHORT).show();
                    setResult(RESULT_OK);
                    break;
            }

        }

注意:1.应用签名是否一致

          2.打包之后再测试

          3.不能以客户端返回结果为准,需要以服务器端的接收的支付通知或查询API返回的结果为准(就是WXPayEntryActivity类中的回调onResp方法中的代码)

          4.

二、支付宝支付(有加密方式的)

1.依赖、权限、jar包就不写了,按照官网上的来就好

2.回调

 //支付宝支付
    private static final int SDK_PAY_FLAG = 1;
    private static final int SDK_AUTH_FLAG = 2;
    //支付宝合作者的账号
    public static final String PARTNER = "合作者账号";
    // 商户收款账号
    public static final String SELLER = "收款账号";
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            switch (msg.what) {
                case SDK_PAY_FLAG: {
                    @SuppressWarnings("unchecked")
                    PayResult payResult = new PayResult((Map<String, String>) msg.obj);
                    /**
                     对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
                     */
                    String resultInfo = payResult.getResult();// 同步返回需要验证的信息
                    String resultStatus = payResult.getResultStatus();
                    // 判断resultStatus 为9000则代表支付成功
                    if (TextUtils.equals(resultStatus, "9000")) {
                        // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
                        Toast.makeText(mContext, "支付宝支付成功了", Toast.LENGTH_SHORT).show();
              
                    } else {
                        // 该笔订单真实的支付结果,需要依赖服务端的异步通知。
                        Toast.makeText(mContext, "支付失败", Toast.LENGTH_SHORT).show();
                    }
                    break;
                }
                case SDK_AUTH_FLAG: {
                    @SuppressWarnings("unchecked")
                    AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true);
                    String resultStatus = authResult.getResultStatus();

                    // 判断resultStatus 为“9000”且result_code
                    // 为“200”则代表授权成功,具体状态码代表含义可参考授权接口文档
                    if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
                        // 获取alipay_open_id,调支付时作为参数extern_token 的value
                        // 传入,则支付账户为该授权账户
                        Toast.makeText(mContext,
                                "授权成功\n" + String.format("authCode:%s", authResult.getAuthCode()),
                                Toast.LENGTH_SHORT)
                                .show();
                    } else {
                        // 其他状态值则为授权失败
                        Toast.makeText(mContext,
                                "授权失败" + String.format("authCode:%s", authResult.getAuthCode()),
                                Toast.LENGTH_SHORT).show();
                    }
                    break;
                }
                default:
                    break;
            }


        }
    };

3.直接调用Alipay()方法就行

    //支付宝支付
    public void Alipay(RechargeBean rechargeBean) {

        String body = rechargeBean.getBody();
        String notify_url = rechargeBean.getNotify_url();
        String out_trade_no = rechargeBean.getOut_trade_no();
        String subject = rechargeBean.getSubject();
        double total_fee = rechargeBean.getTotal_fee();
        String price = String.valueOf(total_fee);

        String orderInfo = getOrderInfo(subject, body, price, notify_url, out_trade_no);


        /**
         * 特别注意,这里的签名逻辑需要放在服务端,切勿将私钥泄露在代码中!
         */
        String sign = sign(orderInfo);
        try {
            //仅需对sign 做URL编码
            sign = URLEncoder.encode(sign, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }


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


        Runnable payRunnable = new Runnable() {
            @Override
            public void run() {
                PayTask alipay = new PayTask(mContext);
                Map<String, String> result = alipay.payV2(payInfo, true);
                Log.i("msp", result.toString());
                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                handler.sendMessage(msg);
            }
        };


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




    }






    //create the order info. 创建订单信息 支付宝订单信息拼接
    private String getOrderInfo(String subject, String body, String price, String notify_url,
                                String out_trade_no) {


        // 签约合作者身份ID
        String orderInfo = "partner=" + "\"" + PARTNER + "\"";
        // 签约卖家支付宝账号
        orderInfo += "&seller_id=" + "\"" + SELLER + "\"";
        // 商户网站唯一订单号
        orderInfo += "&out_trade_no=" + "\"" + out_trade_no + "\"";
        // 商品名称
        orderInfo += "&subject=" + "\"" + subject + "\"";
        // 商品详情
        orderInfo += "&body=" + "\"" + body + "\"";
        // 商品金额
        orderInfo += "&total_fee=" + "\"" + price + "\"";
        // 服务器异步通知页面路径
        orderInfo += "&notify_url=" + "\"" + notify_url + "\"";
        // 服务接口名称, 固定值
        orderInfo += "&service=\"mobile.securitypay.pay\"";
        // 支付类型, 固定值
        orderInfo += "&payment_type=\"1\"";
        // 参数编码, 固定值
        orderInfo += "&_input_charset=\"utf-8\"";


        // 设置未付款交易的超时时间
        // 默认30分钟,一旦超时,该笔交易就会自动被关闭。
        // 取值范围:1m~15d。
        // m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。
        // 该参数数值不接受小数点,如1.5h,可转换为90m。
        orderInfo += "&it_b_pay=\"30m\"";


        // extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
        // orderInfo += "&extern_token=" + "\"" + extern_token + "\"";


        // 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空
        orderInfo += "&return_url=\"m.alipay.com\"";


        // 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)
        // orderInfo += "&paymethod=\"expressGateway\"";
        return orderInfo;
    }




    //get the sign type we use. 获取签名方式
    private String getSignType() {
        return "sign_type=\"RSA\"";
    }


    //sign the order info. 对订单信息进行签名,,ALIPAY_PRIVATEKEY是支付宝私钥
    private String sign(String content) {
        return SignUtils.sign(content, Contants.ALIPAY_PRIVATEKEY);
    }

4.

5.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值