微信小程序支付簽名失敗通常源于簽名生成錯(cuò)誤。本文將詳細(xì)講解Java環(huán)境下微信支付簽名的正確生成方法,并提供代碼示例。
小程序支付簽名驗(yàn)證失敗的根本原因是客戶端生成的簽名與服務(wù)端校驗(yàn)結(jié)果不符。 要確保簽名一致性,必須嚴(yán)格遵循微信支付接口規(guī)范生成簽名,這包含三個(gè)步驟:數(shù)據(jù)準(zhǔn)備、數(shù)據(jù)排序拼接和簽名加密。
首先,準(zhǔn)備待簽名數(shù)據(jù)。這些數(shù)據(jù)通常包括訂單信息、時(shí)間戳、隨機(jī)字符串等,具體字段以微信支付接口文檔為準(zhǔn),例如:appid、timestamp、noncestr、package、signType等。
立即學(xué)習(xí)“Java免費(fèi)學(xué)習(xí)筆記(深入)”;
其次,對(duì)數(shù)據(jù)進(jìn)行字典序排序,并按key=value&格式拼接成字符串。拼接順序和格式必須與微信支付規(guī)范完全一致。
最后,使用商戶密鑰對(duì)拼接后的字符串進(jìn)行加密,生成最終簽名。微信支付通常使用MD5或SHA256算法,需根據(jù)接口文檔選擇。
以下是一個(gè)Java代碼示例,演示如何生成微信支付簽名:
import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.*; public class WeChatPaySignGenerator { public static String generatePaySign(Map<String, String> params, String apiKey) { List<String> keys = new ArrayList<>(params.keySet()); Collections.sort(keys); StringBuilder sb = new StringBuilder(); for (String key : keys) { String value = params.get(key); sb.append(key).append("=").append(value).append("&"); } sb.append("key=").append(apiKey); String sign = MD5Util.md5(sb.toString()).toUpperCase(); return sign; } static class MD5Util { public static String md5(String data) { try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] bytes = md.digest(data.getBytes(StandardCharsets.UTF_8)); StringBuilder sb = new StringBuilder(); for (byte b : bytes) { String hex = Integer.toHexString(b & 0xFF); if (hex.length() == 1) { sb.append("0"); } sb.append(hex); } return sb.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } } } public static void main(String[] args) { Map<String, String> params = new HashMap<>(); params.put("appId", "your_appId"); //替換為你的appId params.put("timeStamp", "1678901234"); //替換為你的時(shí)間戳 params.put("nonceStr", "your_nonceStr"); //替換為你的隨機(jī)字符串 params.put("package", "your_package"); //替換為你的package params.put("signType", "MD5"); String apiKey = "your_apiKey"; //替換為你的apiKey String paySign = WeChatPaySignGenerator.generatePaySign(params, apiKey); System.out.println(paySign); } }
請(qǐng)將代碼中的占位符替換為你的實(shí)際 appId、時(shí)間戳、隨機(jī)字符串、package 和 apiKey。 確保使用的密鑰正確,并且參數(shù)與微信支付接口文檔完全一致。 如果微信支付接口要求使用SHA256算法,則需要修改代碼中的MD5算法部分。 仔細(xì)檢查每個(gè)步驟,確保沒(méi)有拼寫(xiě)錯(cuò)誤或格式問(wèn)題。