H5 相关
H5 游戏支付时需要的字段
字段|类型|是否必填|说明|
---|---|---|---|---
appid|String|必填|应用ID
app_order|String|必填|应用服务器订单号
amount|Integer|必填|订单金额,单位为分
,最小为 200
goods_name|String|必填|商品名
user_data|String|可选|透传数据
sign|String|必填|校验的 sign
sign 字段生成规则
将上表中除 sign 外的非空字段按照 ASCII 码排序后用 =
和&
进行拼接再加上 &key=api secret
, 然后MD5 大写生成 sign
的值
如各字段的值如下: 字段|值|说明 ---|---|--- appid|ee1884a9ec0f7f50a7e39636c0d7106f|应用ID, 从 后台获取 api_secret|cf9cab9b922b43dc26252ac25b42829b|api 加密串,从后台获取 amount|1000 app_order|Test_1535428860481| goods_name|斗地主 user_data|test|可选字段
将 appid, amount, app_order, goods_name, user_data这几个字段排序拼接得到字符串:
amount=1000&app_order=Test_1535428860481&appid=ee1884a9ec0f7f50a7e39636c0d7106f&goods_name=斗地主&user_data=test
最后添加上 &key=cf9cab9b922b43dc26252ac25b42829b
得到字符串:
amount=1000&app_order=Test_1535428860481&appid=ee1884a9ec0f7f50a7e39636c0d7106f&goods_name=斗地主&user_data=test&key=cf9cab9b922b43dc26252ac25b42829b
对上述字符串进行MD5 加密然后转大写得到 A3446E082396FCFA911FC798303EFD73
字符串.
注: 上述的 appid 和 api secret 为测试用的应用ID 和通信加密串
java demo
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.HashMap;
/**
* 生成 sign 字段的 util
*/
public class Sign {
/**
* 生成 sign 字段的 方法
*/
public static String makeSign(String appId, String apiSecret, String appOrder, String goodsName, String userData, int amount) {
HashMap<String, String> param = new HashMap<>();
param.put("appid", appId);
param.put("app_order", appOrder);
param.put("amount", String.valueOf(amount));
param.put("goods_name", goodsName);
param.put("user_data", userData);
Object[] keys = param.keySet().toArray();
Arrays.sort(keys);
StringBuilder builder = new StringBuilder();
for(Object key : keys){
String value = param.get(key);
if(key != null && !key.equals("")) { // 去掉非空字段
builder.append(key);
builder.append("=");
builder.append(value);
builder.append("&");
}
}
builder.append("key");
builder.append("=");
builder.append(apiSecret);
String str = builder.toString();
return md5(str).toUpperCase();
}
/**
* 字符串 md5
*/
private static String md5(String ss) {
byte[] hash;
try {
hash = MessageDigest.getInstance("MD5").digest(ss.getBytes("UTF-8"));
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("Huh, MD5 should be supported?", e);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("Huh, UTF-8 should be supported?", e);
}
StringBuilder hex = new StringBuilder(hash.length * 2);
for (byte b : hash) {
if ((b & 0xFF) < 0x10) hex.append("0");
hex.append(Integer.toHexString(b & 0xFF));
}
return hex.toString();
}
}