java实现微信App支付服务端

Java实现微信App支付服务端的完整攻略:

第一步:注册微信商户平台账号和开通支付功能

  • 首先注册微信商户平台账号,并进行企业资质和银行账户的认证;
  • 在商户平台上,为自己的应用开通支付功能--微信支付;
  • 获取支付证书,在商户平台上进行证书下载、安装和导入等操作;

第二步:生成签名

对请求参数按照ASCII码的顺序进行排序,然后再将所有参数键值对以URL传参方式拼接成字符串,最后使用商户证书中的API密钥进行签名处理。具体示例如下:

public static String createSign(SortedMap<String, Object> parameters, String key) throws Exception {
    StringBuilder sb = new StringBuilder();
    for (Map.Entry<String, Object> entry : parameters.entrySet()) {
        String value = entry.getValue().toString().trim();
        if (!value.equals("") && entry.getKey() != "sign") {
            sb.append(entry.getKey() + "=" + entry.getValue() + "&");
        }
    }
    sb.append("key=" + key);
    String sign = DigestUtils.md5Hex(sb.toString()).toUpperCase();
    return sign;
}

第三步:获取预支付交易单号

发起统一下单请求,获取预支付交易单号。请求参数包含商品描述、商户订单号、总金额、终端IP、交易起始时间、交易结束时间等。具体示例如下:

public static String unifiedOrder(String outTradeNo, String appId, String mchId, 
                                  String body, String totalFee, String notifyUrl,
                                  String tradeType, String openid) throws Exception {
    SortedMap<String, Object> paramMap = new TreeMap<>();
    paramMap.put("appid", appId);
    paramMap.put("mch_id", mchId);
    paramMap.put("nonce_str", RandomStringGenerator.getRandomStringByLength(32));
    paramMap.put("body", body);
    paramMap.put("out_trade_no", outTradeNo);
    paramMap.put("total_fee", totalFee);
    paramMap.put("spbill_create_ip", "127.0.0.1");
    paramMap.put("notify_url", notifyUrl);
    paramMap.put("trade_type", tradeType);
    if (openid != null && !"".equals(openid)) {
        paramMap.put("openid", openid);
    }
    String sign = createSign(paramMap, Constant.MD5_KEY);
    paramMap.put("sign", sign);        
    String requestXML = XmlUtils.getRequestXml(paramMap);

    String resultXml = HttpClientUtils.httpsRequest(Constant.UNIFIED_ORDER_URL,
                                "POST", requestXML, Constant.UTF8);
    Map<String, String> resultMap = XmlUtils.toMap(resultXml);
    String prepayId = resultMap.get("prepay_id");
    return prepayId;
}

第四步:获取APP端支付信息

通过预支付交易单号进行签名,获取APP端支付信息。具体示例如下:

public static SortedMap<String, Object> getAppPayInfo(String prepayid) throws Exception {
    SortedMap<String, Object> param = new TreeMap<>();
    param.put("appid", Constant.APP_ID);
    param.put("partnerid", Constant.MCH_ID);
    param.put("prepayid", prepayid);
    param.put("package", "Sign=WXpay");
    param.put("noncestr", RandomStringGenerator.getRandomStringByLength(32));
    param.put("timestamp", System.currentTimeMillis() / 1000);
    String sign = createSign(param, Constant.MD5_KEY);
    param.put("sign", sign);
    return param;
}

示例一:生成签名

假设请求参数如下:

SortedMap<String, Object> paramMap = new TreeMap<>();
paramMap.put("appid", "wx2421b1c4370ec43b");
paramMap.put("mch_id", "10000100");
paramMap.put("device_info", "1000");
paramMap.put("body", "test");
paramMap.put("nonce_str", "ibuaiVcKdpRxkhJA");
String sign = createSign(paramMap, "192006250b4c09247ec02edce69f6a2d");

根据API密钥进行签名,签名结果如下:

9A0A8659F005D6984697E2CA0A9CF3B7

示例二:获取预支付交易单号

假设请求参数如下:

String outTradeNo = "20150806125346";
String appId = "wx2421b1c4370ec43b";
String mchId = "10000100";
String body = "test";
String totalFee = "1";
String notifyUrl = "http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php";
String tradeType = "APP";
String openid = "";
String prepayId = unifiedOrder(outTradeNo, appId, mchId, body, totalFee, notifyUrl, tradeType, openid);

根据请求参数,发起统一下单请求,获取预支付交易单号。

示例三:获取APP端支付信息

假设预支付交易单号为:wx2017122310341035e118d5f70428361420,则获取APP端支付信息如下:

SortedMap<String, Object> payInfo = getAppPayInfo("wx2017122310341035e118d5f70428361420");

其中,payInfo为签名后的APP端支付信息,可直接传递给APP端进行支付。

阅读剩余 62%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现微信App支付服务端 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 正则表达式教程之子表达式用法分析

    正则表达式教程之子表达式用法分析 正则表达式是一种强大的文本匹配工具,子表达式是其中一个重要的概念。子表达式可以帮助我们更精确地匹配和提取文本中的内容。本攻略将详细介绍子表达式的用法,并提供两个示例说明。 子表达式的语法 子表达式是由括号 () 包围的一组正则表达式。括号内的表达式可以被视为一个整体,可以对其进行重复、分组和引用等操作。 以下是子表达式的一些…

    other 2023年7月28日
    00
  • iOS 9正式版下载地址(iPhone/iPad/iTouch) 附升级教程!

    iOS 9正式版下载地址(iPhone/iPad/iTouch) 附升级教程! iOS 9是苹果公司最新发布的操作系统版本,带来了许多新功能和改进。如果你想下载并升级到iOS 9正式版,下面是详细的攻略。 步骤一:备份数据 在升级之前,强烈建议你备份设备上的所有数据。这样,即使在升级过程中出现问题,你也可以恢复到之前的状态。你可以通过iTunes或iClou…

    other 2023年8月4日
    00
  • C语言超详细讲解数据结构中双向带头循环链表

    C语言超详细讲解数据结构中双向带头循环链表 什么是双向带头循环链表 双向带头循环链表是一种非常常用的数据结构,它由多个节点组成,每个节点都有一个前驱指针和一个后继指针,形成一个双向链表;同时,它也是循环链表,即链表的头指针和尾指针是相连的形成一个环的结构;而带头链表则是在链表的开头添加一个头节点来方便书写,方便读者理解,常见于书籍和教程中。 因此,双向带头循…

    other 2023年6月27日
    00
  • C++中static修饰符的详解及其作用介绍

    C++中static修饰符的详解及其作用介绍 什么是static修饰符 在C++中,static是一个关键字,它可以用来修饰变量、函数、类和成员变量等。使用static修饰符可以改变变量、函数、类和成员变量的作用范围和生命周期。 static修饰符的作用 静态变量 使用static修饰变量可以使该变量具有静态存储方式,即在程序的整个生命周期中,该变量只会被分…

    other 2023年6月27日
    00
  • vue新建项目并配置标准路由过程解析

    下面是Vue新建项目并配置标准路由的完整攻略: 步骤一:安装Vue CLI 安装Vue CLI是使用Vue.js创建新项目的第一步。Vue CLI可以让你快速构建基于Vue.js的应用程序,还可以自动生成标准的项目结构和配置,让开发变得更加高效。运行以下命令安装Vue CLI: npm install -g @vue/cli 步骤二:创建新项目 完成Vue …

    other 2023年6月27日
    00
  • C语言中不定参数 … 的语法以及函数封装

    C语言中的不定参数是指函数参数个数可以不固定,在参数类型、个数和顺序都不能确定时使用。在函数定义时,借助三个点(…)表示不定参数,而在调用时,需要在函数参数列表中列出实际传入的所有参数。 下面是三点要点: 函数定义时使用省略号(…)来表示参数数量不固定: int sum(int count, …) { int total = 0; va_list…

    other 2023年6月27日
    00
  • ntrun怎么使用?nTrun快速启动工具使用技巧分享

    ntrun怎么使用? 1. ntrun是什么? ntrun是一款快速启动工具,可以帮助用户快速启动Windows系统中的各种程序和命令。使用ntrun可以提高用户的工作效率,特别是经常需要使用命令行工具的用户。 2. 如何使用ntrun? 2.1 下载并安装ntrun ntrun可以在官方网站上下载。下载完成后,按照提示进行安装即可。 2.2 启动ntrun…

    other 2023年6月27日
    00
  • 浅谈js构造函数的方法与原型prototype

    (注意:以下为标准markdown格式文本) 浅谈JS构造函数的方法与原型prototype JS中的构造函数是用来创建对象的模板,通过创建它的实例可以方便地生成多个相似的对象。在JS中,构造函数和prototype之间有着密不可分的关系,本文将为大家详细讲解JS构造函数与prototype的使用方法。 构造函数的定义 在JS中,构造函数本质上是一种特殊的函…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部