关于微信商家向用户零钱付款 后端实现
网络上大部分都是用户向商家付款的案例。近期碰到这样一个需求,要求商家向个人账号付款,查询相关资料却寥寥无几。现将个人实现过程总结如下,以供大家批评指正。
首先我先是看了微信支付的接口文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1
,建议大家在实现之前可以阅读一下,熟悉一下流程。
整体的实现思路:
1、获取数据,具体请求参数请参考微信支付文档(https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2)
2、生成签名,也可将此步骤归于第一步操作,此过程也是在对请求参数进行处理。
签名生成的通用步:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。 注意:密钥的长度为32个字节。
3、通过java程序向微信提供的接口发送数据(这里用的是post)
实现代码
准备数据
packageParams.put("appid", WXConst.appId);
packageParams.put("mch_id", WXConst.mch_id);
packageParams.put("nonce_str", nonce_str);
packageParams.put("body", body); packageParams.put("out_trade_no",orderNumber.toString());//订单号
packageParams.put("total_fee", money);
packageParams.put("spbill_create_ip", spbill_create_ip);
packageParams.put("notify_url", WXConst.notify_url);
packageParams.put("trade_type", WXConst.TRADETYPE);
packageParams.put("openid", openid);
将数据按照 “参数=参数值”的形式用“&”拼接成字符串(已将具体业务逻辑写成通用方法,这里直接将方法贴出)
public static String createLinkString(Map<String, String> params) {
List<String> keys = new ArrayList<String>(params.keySet());
Collections.sort(keys);
String prestr = "";
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
String value = params.get(key);
if (i ==</