标签:内部订单 mpi string appid 问题 anti sources 2.4 ringbuf



| 参数 | 说明 | 备注 |
| appId | 开发者应用ID,在 “开发 - 基本配置” 查看 | |
| mch_id | 微信支付的商户号,在 “微信支付 - 商户信息” 查看 | |
| device_info | 终端设备号(门店号或收银设备ID) | PC网页或公众号内支付,则传 “WEB” |
| body | 商品或支付的简单描述 | |
| trade_type | 可取值JSAPI,NATIVE,APP等,我们这里使用的是JSAPI | JSAPI 公众号支付;NATIVE 原生扫码支付;APP app支付 |
| nonce_str | 随机字符串 | 参考算法:《微信支付官方文档 - 安全规范》 |
| notify_url | 通知地址,微信支付成功后,微信服务器会发送信息到该url | |
| out_trade_no | 商户系统内部订单号,由商户自定义,订单号要保持唯一性 | |
| total_fee | 订单总金额,单位:分 | |
| openid | 用户标识,用户在该公众号下的唯一身份标识 | |
| sign | 签名 | 参考算法:《微信支付官方文档 - 安全规范》 |
| key | API密钥,在 “微信商户平台 - 账户中心 - API安全 - API密钥” |
String appId = WeChatAPI.getAppID();String body = "JSAPI支付测试";String merchantId = WeChatAPI.getMerchantID();String tradeNo = String.valueOf(new Date().getTime());String nonceStr1 = SignUtil.createNonceStr();String notifyUrl = "http://k169710n05.51mypc.cn/pay/do/afterPaySuccess.q";String openId = "okAkc0muYuSJUtvMf2UUQHnqYvM4";String totalFee = "1";TreeMap<String, String> map = new TreeMap<String, String>();map.put("appid", appId);map.put("mch_id", merchantId);map.put("device_info", "WEB");map.put("body", body);map.put("trade_type", "JSAPI");map.put("nonce_str", nonceStr1);map.put("notify_url", notifyUrl);map.put("out_trade_no", tradeNo);map.put("total_fee", totalFee);map.put("openid", openId);String sign = SignUtil.createSign(map);String xml = "<xml>" +"<appid>" + appId + "</appid>" +"<body>" + body +"</body>" +"<device_info>WEB</device_info>" +"<mch_id>" + merchantId + "</mch_id>" +"<nonce_str>" + nonceStr1 + "</nonce_str>" +"<notify_url>" + notifyUrl +"</notify_url>" +"<openid>" + openId + "</openid>" +"<out_trade_no>" + tradeNo + "</out_trade_no>" +"<total_fee>" + totalFee + "</total_fee>" +"<trade_type>JSAPI</trade_type>" +"<sign>" + sign + "</sign>" +"</xml>";
/*** 生成随机数* <p>算法参考:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3</p>* @return 随机数字符串*/public static String createNonceStr() {SecureRandom random = new SecureRandom();int randomNum = random.nextInt();return Integer.toString(randomNum);}/*** 生成签名,用于在微信支付前,获取预支付时候需要使用的参数sign* <p>算法参考:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3</p>* @param params 需要发送的所有数据设置为的Map* @return 签名sign*/public static String createSign(TreeMap<String, String> params) {String signValue = "";String stringSignTemp = "";String stringA = "";//获得stringASet<String> keys = params.keySet();for (String key : keys) {stringA += (key + "=" + params.get(key) + "&");}stringA = stringA.substring(0, stringA.length() - 1);//获得stringSignTempstringSignTemp = stringA + "&key=" + WeChatAPI.getMerchantKey();//获得signValuesignValue = encryptByMD5(stringSignTemp).toUpperCase();log.debug("预支付签名:" + signValue);return signValue;}/*** MD5加密** @param sourceStr* @return*/public static String encryptByMD5(String sourceStr) {String result = "";try {MessageDigest md = MessageDigest.getInstance("MD5");md.update(sourceStr.getBytes("UTF-8"));byte b[] = md.digest();int i;StringBuffer buf = new StringBuffer("");for (int offset = 0; offset < b.length; offset++) {i = b[offset];if (i < 0)i += 256;if (i < 16)buf.append("0");buf.append(Integer.toHexString(i));}result = buf.toString();} catch (NoSuchAlgorithmException e) {System.out.println(e);}return result;}
<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg><appid><![CDATA[wx2421b1c4370ec43b]]></appid><mch_id><![CDATA[10000100]]></mch_id><nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str><openid><![CDATA[oUpF8uMuAJO_M2pxb1Q9zNjWeS6o]]></openid><sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign><result_code><![CDATA[SUCCESS]]></result_code><prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id><trade_type><![CDATA[JSAPI]]></trade_type></xml>
String url = WeChatAPI.getUrl_prePay();String result = NetUtil.sendRequest(url, "POST", xml);String reg = "<prepay_id><!\\[CDATA\\[(\\w+)\\]\\]></prepay_id>";Pattern pattern = Pattern.compile(reg);Matcher matcher = pattern.matcher(result);String prepayId = "";while (matcher.find()) {prepayId = matcher.group(1);log.debug("预支付ID:" + prepayId);}
| 参数 | 说明 | 备注 |
| appId | 开发者应用ID,在 “开发 - 基本配置” 查看 | |
| timeStamp | 时间戳,标准北京时间,秒级(10位数字) | |
| nonceStr | 随机字符串 | 参考算法:《微信支付官方文档 - 安全规范》 |
| package | 订单详情扩展字符串,其实就是预支付ID | 示例: prepay_id=*** |
| signType | 签名方式,暂支持MD5 | |
| paySign | 签名 | 参考算法:《微信支付官方文档 - 安全规范》 |
String url = WeChatAPI.getUrl_prePay();String result = NetUtil.sendRequest(url, "POST", xml);String reg = "<prepay_id><!\\[CDATA\\[(\\w+)\\]\\]></prepay_id>";Pattern pattern = Pattern.compile(reg);Matcher matcher = pattern.matcher(result);String prepayId = "";while (matcher.find()) {prepayId = matcher.group(1);log.debug("预支付ID:" + prepayId);}Date beijingDate = Calendar.getInstance(Locale.CHINA).getTime();String nonceStr2 = SignUtil.createNonceStr();JSONObject json = new JSONObject();json.put("appId", appId);json.put("timeStamp", beijingDate.getTime() / 1000);json.put("nonceStr", nonceStr2);json.put("package", "prepay_id=" + prepayId);json.put("signType", "MD5");TreeMap<String, String> map2 = new TreeMap<String, String>();map2.put("appId", appId);map2.put("timeStamp", String.valueOf(beijingDate.getTime() / 1000));map2.put("nonceStr", nonceStr2);map2.put("package", "prepay_id=" + prepayId);map2.put("signType", "MD5");String paySign = SignUtil.createSign(map2);json.put("paySign", paySign);String re = json.toJSONString();AjaxSupport.sendSuccessText(null, re);
function onBridgeReady(){WeixinJSBridge.invoke(‘getBrandWCPayRequest‘, {"appId":"wx2421b1c4370ec43b", //公众号名称,由商户传入"timeStamp":"1395712654", //时间戳,自1970年以来的秒数"nonceStr":"e61463f8efa94090b1f366cccfbbb444", //随机串"package":"prepay_id=u802345jgfjsdfgsdg888","signType":"MD5", //微信签名方式:"paySign":"70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名},function(res){if(res.err_msg == "get_brand_wcpay_request:ok" ) {} // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。});}if (typeof WeixinJSBridge == "undefined"){if( document.addEventListener ){document.addEventListener(‘WeixinJSBridgeReady‘, onBridgeReady, false);}else if (document.attachEvent){document.attachEvent(‘WeixinJSBridgeReady‘, onBridgeReady);document.attachEvent(‘onWeixinJSBridgeReady‘, onBridgeReady);}}else{onBridgeReady();}
$().invoke("/pay/do/pay.q", null, function (re) {var result = JSON.parse(re);function onBridgeReady(){WeixinJSBridge.invoke(‘getBrandWCPayRequest‘, result, function(res){alert(JSON.stringify(res));if(res.err_msg == "get_brand_wcpay_request:ok" ) {//doit 这里处理支付成功后的逻辑,通常为页面跳转}});}if (typeof WeixinJSBridge == "undefined"){if( document.addEventListener ){document.addEventListener(‘WeixinJSBridgeReady‘, onBridgeReady, false);}else if (document.attachEvent){document.attachEvent(‘WeixinJSBridgeReady‘, onBridgeReady);document.attachEvent(‘onWeixinJSBridgeReady‘, onBridgeReady);}}else{onBridgeReady();}});

- ...
String notifyUrl = "http://k169710n05.51mypc.cn/pay/do/afterPaySuccess.q";- ...
String xml = "<xml>" +"<appid>" + appId + "</appid>" +"<body>" + body +"</body>" +"<device_info>WEB</device_info>" +"<mch_id>" + merchantId + "</mch_id>" +"<nonce_str>" + nonceStr1 + "</nonce_str>" +"<notify_url>" + notifyUrl +"</notify_url>" +"<openid>" + openId + "</openid>" +"<out_trade_no>" + tradeNo + "</out_trade_no>" +"<total_fee>" + totalFee + "</total_fee>" +"<trade_type>JSAPI</trade_type>" +"<sign>" + sign + "</sign>" +"</xml>";
[5] 微信公众号开发 - 微信支付功能开发(网页JSAPI调用)
标签:内部订单 mpi string appid 问题 anti sources 2.4 ringbuf
原文地址:http://www.cnblogs.com/deng-cc/p/7183239.html