美文网首页
钱方支付-扫码支付

钱方支付-扫码支付

作者: 我才是张雷 | 来源:发表于2018-03-19 18:29 被阅读0次

官方文档

官方文档调用用的是python写的,作为一名Android开发,看的我一脸懵逼,记录下自己写的方法

实战

1.首先是参数,这里的支付金额(txamt)填的是1,实际支付是0.01,切记不能填0.01,会返回参数txamt错误

        Map<String, String> map = new HashMap<>();
        map.put("txamt", "1");
        map.put("txcurrcd", "CNY");
        map.put("pay_type", type);
        map.put("out_trade_no", String.valueOf(System.currentTimeMillis()));
        map.put("txdtm", format);
        map.put("goods_name", "张雷");
官方参数说明.png

2.根据参数生成未签名的字符串,必须给Mapkeyvalue进行编码转换,然后根据key升序排序,并后用&符号连接每个keyvalue(举个例子:a=b&c=d),最后拼接上钱方提供的key后MD5一下就完成了

    private String make_req_sign(Map<String, String> params, String key) {
        Set<String> keys = params.keySet();
        List<String> result = new ArrayList<>(keys);
        Collections.sort(result);
        StringBuilder data = new StringBuilder();
        for (String s : result) {
            Log.e("test", "make_req_sign: " + s);
            String k = unicodeToUtf8(s);
            String v = unicodeToUtf8(params.get(k));
            String format = String.format("%s=%s", k, v);
            data.append(format);
            data.append("&");
        }
        String unsign_str = "";
        if (data.length() > 0) {
            unsign_str = data.substring(0, data.length() - 1) + key;
        }
        Log.e("test", "make_req_sign:unsign_str = " + unsign_str);
        return MD5(unsign_str);
    }

unicodeToUtf8方法

    /**
     * unicode 转换成 utf-8
     *
     * @param theString
     * @return
     * @author fanhui
     * 2007-3-15
     */
    public String unicodeToUtf8(String theString) {
        char aChar;
        int len = theString.length();
        StringBuffer outBuffer = new StringBuffer(len);
        for (int x = 0; x < len; ) {
            aChar = theString.charAt(x++);
            if (aChar == '\\') {
                aChar = theString.charAt(x++);
                if (aChar == 'u') {
                    // Read the xxxx
                    int value = 0;
                    for (int i = 0; i < 4; i++) {
                        aChar = theString.charAt(x++);
                        switch (aChar) {
                            case '0':
                            case '1':
                            case '2':
                            case '3':
                            case '4':
                            case '5':
                            case '6':
                            case '7':
                            case '8':
                            case '9':
                                value = (value << 4) + aChar - '0';
                                break;
                            case 'a':
                            case 'b':
                            case 'c':
                            case 'd':
                            case 'e':
                            case 'f':
                                value = (value << 4) + 10 + aChar - 'a';
                                break;
                            case 'A':
                            case 'B':
                            case 'C':
                            case 'D':
                            case 'E':
                            case 'F':
                                value = (value << 4) + 10 + aChar - 'A';
                                break;
                            default:
                                throw new IllegalArgumentException(
                                        "Malformed   \\uxxxx   encoding.");
                        }
                    }
                    outBuffer.append((char) value);
                } else {
                    if (aChar == 't')
                        aChar = '\t';
                    else if (aChar == 'r')
                        aChar = '\r';
                    else if (aChar == 'n')
                        aChar = '\n';
                    else if (aChar == 'f')
                        aChar = '\f';
                    outBuffer.append(aChar);
                }
            } else
                outBuffer.append(aChar);
        }
        return outBuffer.toString();
    }

MD5方法

    private String MD5(String s) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] bytes = md.digest(s.getBytes("utf-8"));
            return toHex(bytes);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private String toHex(byte[] bytes) {

        final char[] HEX_DIGITS = "0123456789ABCDEF".toCharArray();
        StringBuilder ret = new StringBuilder(bytes.length * 2);
        for (int i = 0; i < bytes.length; i++) {
            ret.append(HEX_DIGITS[(bytes[i] >> 4) & 0x0f]);
            ret.append(HEX_DIGITS[bytes[i] & 0x0f]);
        }
        return ret.toString();
    }

}

3.请求钱方接口获取签名信息,每个人的网络框架不同,我就贴一下关键代码(我用的是OkHttp)

                .addHeader("X-QF-APPCODE", "钱方的code")
                .addHeader("X-QF-SIGN", make_req_sign(map, "钱方的key"))
                .params(map)

4.返回结果

{
    "pay_type": "800201",
    "sysdtm": "2016-04-11 17:58:34",
    "txdtm": "2016-04-11 17:51:00",
    "resperr": "",
    "txcurrcd": "CNY",
    "txamt": "1",
    "respmsg": "",
    "out_trade_no": "145399626053599943",
    "syssn": "20160411016600020003620875",
    "qrcode": "https://o2.qfpay.com/q/mid?h=zxrLRO8kbLV3QmqdgTm8da",
    "respcd": "0000"
}  
返回的参数说明.png

相关文章

  • 钱方支付-扫码支付

    官方文档 官方文档调用用的是python写的,作为一名Android开发,看的我一脸懵逼,记录下自己写的方法 实战...

  • 一个扫码支付满减活动方案

    背景 某行开发的聚合支付系统,聚合了微信扫码支付、支付宝扫码支付以及本行手机银行扫码支付。通过对本行手机银行扫码支...

  • 走向财务自由第47天:微信零钱和支付宝

    扫码支付现在越来越普遍,带来的是花钱越来越随便。 把支付宝的钱和微信里的钱全部放回银行卡,不再扫码支付,日常生活支...

  • 支付宝支付-扫码支付

    我们接着上一篇文章支付宝支付-刷卡支付(条码支付) 继续来聊聊支付包扫码支付 1、场景介绍 扫码支付,指用户打开支...

  • 免费第三方支付平台公司

    通道已全面开通啦 微信扫码,支付宝扫码,公众号,支付宝wap, 通道已全面开通啦 微信扫码,支付宝扫码,公众号,支...

  • 探索:CodeIgniter集成微信扫码支付方案

    微信扫码支付API文档下载地址:微信扫码支付API文档下载 1. 集成微信扫码支付的CI目录结构 ├─config...

  • vue-pc微信支付

    pc端支付 获取后台给的url生成二维码,用户扫码扫码支付成功后,点击我已经支付按钮,查询支付状况 b页面全部代码...

  • 对接支付渠道知识

    支付渠道 第三方:微信、支付宝、京东银行:银联(云闪付)、信用卡 支付方式 1、付款码支付商户通过扫码枪,对客户二...

  • 微信支付接入流程(PC网站)-Python

    本文流程实现目标: 以pc生成二维码扫码支付(Native支付),微信直接扫二维码即可支付(不需要前端参与扫码逻辑...

  • 聚合支付相关问题

    1.聚合支付 : 收款方使用一个二维码,付款方可以任意使用多个APP扫码支付。其中主要细节在于支付载体为二维码,实...

网友评论

      本文标题:钱方支付-扫码支付

      本文链接:https://www.haomeiwen.com/subject/axwpqftx.html