/**
* @param $appKey 分配的APP_KEY
* @param $secretKey 分类的服务端私有KEY
* @return string 返回生成的sign
*
* $postParams = [
* 'app_key' => 'qh97',
* 'product_id' => 'AC01',
* 'product_name' => '能量豆',
* 'app_order_id' => '1232132133',
* 'app_district' => 1,
* 'app_server' => 2,
* 'app_user_id' => 'test01',
* 'app_user_name' => 'test',
* 'money_amount' => 2.13,
* 'pa_open_uid' => 1,
* 'pa_open_order_id' => 'ZX0001',
* 'app_extra1' => '',
* 'app_extra2' => ''
* ]
*
*/
function genCallGameSign($appKey, $secretKey) {
$postParams = $_POST;
if (isset($postParams['sign'])) {
unset($postParams['sign']);
}
ksort($postParams);
$sortedParams = [];
foreach ($params as $k => $v) {
$sortedParams[] = $k . "=" . $v;
}
return md5($appKey . $secretKey . join("&", $sortedParams));
}
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class TestJavaSign {
public static void main(String[] args) throws Exception {
/**
* 这里参数都应是从POST过来的请求中获取,这里模拟request请求数据
*/
Map requestParams = new HashMap();
requestParams.put("app_key", "qh97");
requestParams.put("product_id", "123456");
requestParams.put("product_name", "abc");
requestParams.put("app_order_id", "12343455657");
requestParams.put("app_district", "1");
requestParams.put("app_server", "2");
requestParams.put("app_user_id", "13189");
requestParams.put("app_user_name", "app_name");
requestParams.put("money_amount", "10");
requestParams.put("pa_open_uid", "1368");
requestParams.put("pa_open_order_id", "12342134");
requestParams.put("app_extra1", "extra");
requestParams.put("app_extra2", "extra");
requestParams.put("sign", "88988f0e5c3fe758da6122303fe72835");
payedCallGame("qh97", "124123579123591235u912uu9quwerqwe", requestParams);
}
/**
* 验证请求是否合法
*
* @param appKey 服务端配置的appkey值
* @param secretKey 服务端配置的secretKey值
* @param requestParams 请求参数
*/
public static void payedCallGame(String appKey, String secretKey, Map requestParams) {
/**
* 从POST 请求参数拿到需要签名的参数
*/
Map signParams = new HashMap();
signParams.put("app_key", requestParams.get("app_key"));
signParams.put("product_id", requestParams.get("product_id"));
signParams.put("product_name", requestParams.get("product_name"));
signParams.put("app_order_id", requestParams.get("app_order_id"));
signParams.put("app_district", requestParams.get("app_district"));
signParams.put("app_server", requestParams.get("app_server"));
signParams.put("app_user_id", requestParams.get("app_user_id"));
signParams.put("app_user_name", requestParams.get("app_user_name"));
signParams.put("money_amount", requestParams.get("money_amount"));
signParams.put("pa_open_uid", requestParams.get("pa_open_uid"));
signParams.put("pa_open_order_id", requestParams.get("pa_open_order_id"));
signParams.put("app_extra1", requestParams.get("app_extra1"));
signParams.put("app_extra2", requestParams.get("app_extra2"));
String signVal = genGameCallSign(appKey, secretKey, signParams);
if (signVal.equals(requestParams.get("sign"))) {
//验证成功,合法的支付完成游戏发放请求
//System.out.println("验证成功,合法的支付完成游戏发放请求");
} else {
//验证失败或者非法请求
//System.out.println("验证失败或者非法请求" + signVal);
}
}
public static String genGameCallSign(String appKey, String secretKey, Map params) {
String[] sortedParams = new String[params.size()];
params.keySet().toArray(sortedParams);
Arrays.sort(sortedParams);
StringBuilder sb = new StringBuilder();
for (String key: sortedParams) {
sb.append(String.format("&%s=%s", key, params.get(key)));
}
/**
* 请自己提供md5函数
*/
return MD5.encode(appKey + secretKey + sb.toString().substring(1));
}
}