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();
    }
}

results matching ""

    No results matching ""