钱方支付-扫码支付(微信,支付宝)

官方文档

官方文档调用用的是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", "张雷");
复制代码

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"
}  
复制代码

转载于:https://juejin.im/post/5aaf915151882555784dc48d

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!您可以使用第三方支付库来实现Java扫码支付,支持支付宝微信和银联三合一。以下是一个简单的示例代码: ```java import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.request.AlipayTradePrecreateRequest; import com.alipay.api.response.AlipayTradePrecreateResponse; import com.github.wxpay.sdk.WXPay; import com.github.wxpay.sdk.WXPayConfigImpl; import com.github.wxpay.sdk.WXPayConstants; import com.github.wxpay.sdk.WXPayUtil; import java.util.HashMap; import java.util.Map; public class QRCodePayment { // 支付宝相关配置 private static final String ALIPAY_APP_ID = "your_alipay_app_id"; private static final String ALIPAY_PRIVATE_KEY = "your_alipay_private_key"; private static final String ALIPAY_PUBLIC_KEY = "your_alipay_public_key"; private static final String ALIPAY_GATEWAY = "https://openapi.alipay.com/gateway.do"; // 微信支付相关配置 private static final String WX_PAY_APP_ID = "your_wxpay_app_id"; private static final String WX_PAY_MCH_ID = "your_wxpay_mch_id"; private static final String WX_PAY_KEY = "your_wxpay_key"; private static final String WX_PAY_NOTIFY_URL = "your_wxpay_notify_url"; private static final String WX_PAY_TRADE_TYPE = "NATIVE"; public static void main(String[] args) { // 生成支付宝付款码 String alipayQRCode = generateAlipayQRCode("your_order_id", "100.00"); System.out.println("支付宝付款码:" + alipayQRCode); // 生成微信付款码 String wechatQRCode = generateWechatQRCode("your_order_id", "100"); System.out.println("微信付款码:" + wechatQRCode); } public static String generateAlipayQRCode(String orderId, String amount) { AlipayClient alipayClient = new DefaultAlipayClient(ALIPAY_GATEWAY, ALIPAY_APP_ID, ALIPAY_PRIVATE_KEY, "json", "UTF-8", ALIPAY_PUBLIC_KEY, "RSA2"); AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest(); request.setBizContent("{\"out_trade_no\":\"" + orderId + "\",\"total_amount\":\"" + amount + "\",\"subject\":\"订单支付\",\"store_id\":\"001\"}"); try { AlipayTradePrecreateResponse response = alipayClient.execute(request); if (response.isSuccess()) { return response.getQrCode(); } else { System.out.println("生成支付宝付款码失败:" + response.getSubMsg()); } } catch (AlipayApiException e) { e.printStackTrace(); } return null; } public static String generateWechatQRCode(String orderId, String amount) { WXPayConfigImpl config = new WXPayConfigImpl(); config.setAppID(WX_PAY_APP_ID); config.setMchID(WX_PAY_MCH_ID); config.setKey(WX_PAY_KEY); config.setHttpConnectTimeoutMs(5000); config.setHttpReadTimeoutMs(10000); Map<String, String> data = new HashMap<>(); data.put("appid", WX_PAY_APP_ID); data.put("mch_id", WX_PAY_MCH_ID); data.put("nonce_str", WXPayUtil.generateNonceStr()); data.put("body", "订单支付"); data.put("out_trade_no", orderId); data.put("total_fee", amount); data.put("spbill_create_ip", "127.0.0.1"); data.put("notify_url", WX_PAY_NOTIFY_URL); data.put("trade_type", WX_PAY_TRADE_TYPE); try { WXPay wxPay = new WXPay(config, WXPayConstants.SignType.MD5, false); Map<String, String> resultMap = wxPay.unifiedOrder(data); if ("SUCCESS".equals(resultMap.get("return_code")) && "SUCCESS".equals(resultMap.get("result_code"))) { return resultMap.get("code_url"); } else { System.out.println("生成微信付款码失败:" + resultMap.get("return_msg")); } } catch (Exception e) { e.printStackTrace(); } return null; } } ``` 请注意,上述代码只是一个简单示例,实际使用中需要替换为您自己的支付宝微信支付配置参数,并且需要适配具体的支付库和接口。希望对您有帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值