微信支付:JSAPI或APP拉起支付,return_msg=签名错误

1. 发送给微信的参数xml, 下图中的商户key就是微信后台设置的appsecret

2. 复制到 微信支付接口签名校验工具,  本文适用如下图是检测通过的

如果跟我一样, 检测通过了, 但下单接口仍返回 "签名错误", 唯一的问题就是:

签名方法传的key用的是appsecret, 而正确的应该用支付总账户的api密钥,

// 从数据库获取微信支付配置(换成自己的配置来源即可)
        WxPayConfig wxPayConfig1 = wxPayConfigMapper.selectById(wxId);
// payKey就是支付总账户的api密钥
        String payKey = wxPayConfig1.getApiKey();
        
        SortedMap<Object, Object> paramMap = new TreeMap<Object, Object>();
        paramMap.put("appid", wxPayConfig.getAppId());//公众号ID
        paramMap.put("mch_id", wxPayConfig.getMchId());//商户号
        paramMap.put("nonce_str", RandomUtil.createRandomString(32));//32位随机字符串
        paramMap.put("body", body);//商品描述
        paramMap.put("out_trade_no", out_trade_no);//商户订单号
        paramMap.put("total_fee", StringUtils.substringBefore(String.valueOf(total_fee.multiply(new BigDecimal(100))), "."));//设置交易金额 金额为分
        paramMap.put("spbill_create_ip", ipInfoUtil.getIpAddr(request));// 发起请求的客户机IP
        paramMap.put("notify_url", notifyUrl);//通知地址
        paramMap.put("sign_type", "MD5");//通知地址
        paramMap.put("trade_type", "JSAPI");//支付方式 小程序支付
        paramMap.put("openid", openid);//微信用户在商户对应appid下的唯一标识,trade_type=JSAPI时(即JSAPI支付),此参数必传
        paramMap.put("sign", SignUtil.createSign(paramMap, payKey));// 签名

图下的appsecret是校验工具用来验证签名的,而apikey是下单接口签名用的

apikey是对应微信支付平台的,而微信支付平台可以绑定小程序和app,小程序或app调用统一下单时,参数sign,创建签名时传入的apikey就是它,千万不要传appsecret,我就是因为这个原因导致签名错误。

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用 PHP 实现微信支付的后端代码示例: ```php <?php // 微信支付 API 地址 $api_url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; // 商户号 $merchant_id = "your_merchant_id_here"; // 应用 ID $app_id = "your_app_id_here"; // API 密钥 $api_key = "your_api_key_here"; // 订单信息 $order = array( "body" => "订单描述", "out_trade_no" => "订单号", "total_fee" => 100, // 订单金额,单位为分 "spbill_create_ip" => $_SERVER['REMOTE_ADDR'], // 用户 IP 地址 "notify_url" => "https://example.com/notify.php", // 支付结果通知地址 "trade_type" => "JSAPI", // 支付方式,公众号支付JSAPI "openid" => "用户的openid", ); // 生成签名 $order["appid"] = $app_id; $order["mch_id"] = $merchant_id; $order["nonce_str"] = uniqid(); $order["sign"] = generate_sign($order, $api_key); // 转换为 XML 格式 $xml = array_to_xml($order); // 发送请求 $response = send_request($api_url, $xml); // 处理响应 $result = xml_to_array($response); if ($result["return_code"] == "SUCCESS" && $result["result_code"] == "SUCCESS") { // 获取 prepay_id $prepay_id = $result["prepay_id"]; // 构造 JSAPI 支付参数 $jsapi_params = array( "appId" => $app_id, "timeStamp" => time(), "nonceStr" => uniqid(), "package" => "prepay_id=" . $prepay_id, "signType" => "MD5", ); // 生成签名 $jsapi_params["paySign"] = generate_sign($jsapi_params, $api_key); // 返回 JSAPI 支付参数 echo json_encode($jsapi_params); } else { // 支付失败 echo "支付失败:" . $result["return_msg"]; } // 生成签名函数 function generate_sign($data, $key) { // 去除空值和签名字段 $filtered_data = array_filter($data, function ($value, $key) { return $key != "sign" && $value != ""; }, ARRAY_FILTER_USE_BOTH); // 按照键名升序排序 ksort($filtered_data); // 拼接成字符串 $string = urldecode(http_build_query($filtered_data)) . "&key=" . $key; // 计算 MD5 哈希值 return strtoupper(md5($string)); } // 数组转 XML 格式函数 function array_to_xml($data) { $xml = "<xml>"; foreach ($data as $key => $value) { if (is_numeric($value)) { $xml .= "<$key>$value</$key>"; } else { $xml .= "<$key><![CDATA[$value]]></$key>"; } } $xml .= "</xml>"; return $xml; } // XML 转数组格式函数 function xml_to_array($xml) { $data = array(); $xml_parser = xml_parser_create(); xml_parse_into_struct($xml_parser, $xml, $values); xml_parser_free($xml_parser); foreach ($values as $value) { if ($value["type"] == "complete") { $data[$value["tag"]] = $value["value"]; } } return $data; } // 发送请求函数 function send_request($url, $data) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($ch); curl_close($ch); return $response; } ``` 需要替换的内容: - `$merchant_id`:商户号。 - `$app_id`:应用 ID。 - `$api_key`:API 密钥。 - `$order`:订单信息,根据实际情况填写。 - `$api_url`:微信支付 API 地址,根据实际情况填写。 - `https://example.com/notify.php`:支付结果通知地址,根据实际情况填写。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值