参数排序没有问题,accesstoken没有问题,sessionkey也没有问题
/** * 签名验证 * @param billno * @param userid * @param openkey * @param zoneid * @param appid * @param itemid * @param count * @param pf * @return */ public static String SignVerify(String openid, String offerid, String ts,String zoneid, String pf, String amt, String billno, String accesstoken,String sessionkey){ String appid = ChannelInfo.getInstance().getWeChatAppId();//AppId String secret = ChannelInfo.getInstance().getWeChatSecret();//米大师秘钥 Map<String,String> sigParams = new HashMap<String, String>();
sigParams.put( "openid" ,openid); sigParams.put( "appid" ,appid); sigParams.put( "offer_id" ,offerid); sigParams.put( "ts" ,ts); sigParams.put( "zone_id" ,zoneid); sigParams.put( "pf" ,pf); //制作sig签名 String sig = makeSig(sigParams, "secret" ,secret); if (sig.equals( "" )) { return null ; } //制作mp_sig签名 sigParams.put( "access_token" ,accesstoken); sigParams.put( "sig" ,sig); String mpSig = makeSig(sigParams, "session_key" ,sessionkey); JSONObject json = new JSONObject(); json.put( "openid" , openid); json.put( "appid" , appid); json.put( "offer_id" , offerid); json.put( "ts" , Long.valueOf(ts)); json.put( "zone_id" , zoneid); json.put( "pf" , pf); json.put( "amt" , Integer.valueOf(amt)); json.put( "bill_no" , billno); json.put( "sig" , sig); json.put( "mp_sig" , mpSig); String sandboxUrl = "https://api.weixin.qq.com/cgi-bin/midas/sandbox/pay?access_token=" ;//沙箱环境 String formalUrl = "https://api.weixin.qq.com/cgi-bin/midas/pay?access_token=" ;//正式环境 String result = util.doPost(sandboxUrl+accesstoken, json.toString()); System.out.println( "+++++++++++++++++++++++++++++++ :" +result); return result; } /** * 制作sig签名 * @param sigParams * @param secret * @return */ public static String makeSig(Map //sig签名 String sig= "" ; try { //对参与米大师签名的参数按照key=value的格式,并按照参数名ASCII字典序升序排序 String stringA = getSortQueryString(sigParams); String stringSignTemp = stringA+ "&org_loc=/cgi-bin/midas/getbalance&method=POST&" +secretName+ "=" +secretValue; //使用HMAC-SHA256得到签名 sig = sha256_HMAC(secretValue,stringSignTemp); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return sig; } /** * 获取得到排序好的查询字符串 * @param params 请求参数 * @param isContainSignature 是否包含signature参数 * @return */ public static String getSortQueryString(Map throws Exception { Object[] keys = params.keySet().toArray(); Arrays.sort(keys); StringBuffer sb = new StringBuffer(); for (Object key : keys){ sb.append(String.valueOf(key)).append( "=" ).append(params.get(String.valueOf(key))).append( "&" ); } String text = sb.toString(); if (text.endsWith( "&" )) { text=text.substring( 0 ,text.length()- 1 ); } return text; } /** * sha256_HMAC加密 * * @param message * 消息 * @param secret * 秘钥 * @return 加密后字符串 */ public static String sha256_HMAC(String secret, String message) { String hash = "" ; try { Mac sha256_HMAC = Mac.getInstance( "HmacSHA256" ); SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256" ); sha256_HMAC.init(secret_key); byte [] bytes = sha256_HMAC.doFinal(message.getBytes()); //将加密后的字节数组转换成字符串 hash = byteArrayToHexString(bytes); } catch (Exception e) { System.out.println( "Error HmacSHA256 ===========" + e.getMessage()); } return hash; } /** * 将加密后的字节数组转换成字符串 * * @param b * 字节数组 * @return 字符串 */ private static String byteArrayToHexString( byte [] b) { StringBuilder hs = new StringBuilder(); String stmp; for ( int n = 0 ; b != null && n < b.length; n++) { stmp = Integer.toHexString(b[n] & 0XFF ); if (stmp.length() == 1 ) hs.append( '0' ); hs.append(stmp); } return hs.toString().toLowerCase(); } |
你好,麻烦提供下小游戏的appid和大致报错时间点
appId:wxff3e227af64fe390
报错时间点在,16点07分