生死的微信2微码扫过2微码的奖励是永久的吗

当前位置:&>&&>&&>&
微信扫红码第二期活动开启 扫红码下载应用100%领取微信红包
作者: 围观...次
微信扫红码第二期活动开启 扫红码下载应用100%领取微信红包 之前发过第一期&表示很给力 现在是第二期的& 亮亮这回& 扫2次 都是 5.1元& 貌似&概率很大啊 都是 5.1 爱Q生活网的朋友们 速度先去试试看吧。 这可是现金哦 可直接提现!!! & 必须 有 应用宝客户端& 没有 应用宝的& 没有扫码下载
& 1:打开活动地址& 点击应用图标&& 使用微信扫码
& 2:扫描后 点应用宝 安全下载即可
& 3:下载完成后 微信就收到红包了
活动时间:(第二期)日8点起 至 日24点 & 活动地址&
...人参与 看完本文此刻的感受是?
本站最新更新
··········42408人阅读
一、准备工作首先吐槽一下微信关于支付这块,本身支持的支付模式就好几种,但是官方文档特别零散,连像样的JAVA相关的demo也没几个。本人之前没有搞过微信支付,一开始真是被它搞晕,折腾两天终于调通了,特此写下来,以享后人吧!关于准备工作,就“微信扫码支付模式二”官方文档地址在这
可以先看看,实际上需要准备的东西有以下几个:其中APP_ID和APP_SECRET可以在公众平台找着,MCH_ID和API_KEY则在商户平台找到,特别是API_KEY要在商户平台设置好,对于“微信扫码支付模式二”(支付与回调)实际只会用到APP_ID、MCH_ID和API_KEY,其他的都不用。关于开发环境,我就不罗嗦了,不管你是springMVC、struts2又或者直接serverlet,都差不多,只要你能保证对应的方法能调用起来就行。关于引用第三方的jar包,我这里只用到了一个xml操作的jdom,记住是1.*的版本,不是官网上最新的2.*,两者不兼容。具体是jdom-1.1.3.jar,依赖包jaxen-1.1.6.jar,就这两个包,我没用到有些例子中使用的httpclient,感觉没必要,而且依赖包特别繁杂,当然你是maven当我没说。二、开发实战1、首先是接入微信接口,获取微信支付二维码。public String weixin_pay() throws Exception {
// 账号信息
String appid = PayConfigUtil.APP_ID;
//String appsecret = PayConfigUtil.APP_SECRET; // appsecret
String mch_id = PayConfigUtil.MCH_ID; // 商业号
String key = PayConfigUtil.API_KEY; // key
String currTime = PayCommonUtil.getCurrTime();
String strTime = currTime.substring(8, currTime.length());
String strRandom = PayCommonUtil.buildRandom(4) + &&;
String nonce_str = strTime + strR
String order_price = 1; // 价格
注意:价格的单位是分
String body = &goodssssss&;
// 商品名称
String out_trade_no = &11338&; // 订单号
// 获取发起电脑 ip
String spbill_create_ip = PayConfigUtil.CREATE_IP;
// 回调接口
String notify_url = PayConfigUtil.NOTIFY_URL;
String trade_type = &NATIVE&;
SortedMap&Object,Object& packageParams = new TreeMap&Object,Object&();
packageParams.put(&appid&, appid);
packageParams.put(&mch_id&, mch_id);
packageParams.put(&nonce_str&, nonce_str);
packageParams.put(&body&, body);
packageParams.put(&out_trade_no&, out_trade_no);
packageParams.put(&total_fee&, order_price);
packageParams.put(&spbill_create_ip&, spbill_create_ip);
packageParams.put(&notify_url&, notify_url);
packageParams.put(&trade_type&, trade_type);
String sign = PayCommonUtil.createSign(&UTF-8&, packageParams,key);
packageParams.put(&sign&, sign);
String requestXML = PayCommonUtil.getRequestXml(packageParams);
System.out.println(requestXML);
String resXml = HttpUtil.postData(PayConfigUtil.UFDODER_URL, requestXML);
Map map = XMLUtil.doXMLParse(resXml);
//String return_code = (String) map.get(&return_code&);
//String prepay_id = (String) map.get(&prepay_id&);
String urlCode = (String) map.get(&code_url&);
return urlC
}如果不出意外的话,这里就从微信服务器获取了一个支付url,形如weixin://wxpay/bizpayurl?pr=pIxXXXX,之后我们就需要把这个url生成一个二维码,然后就可以使用自己手机微信端扫码支付了。关于二维码生成有很多种方法,各位各取所需吧,我这里提供一个google的二维码生成接口: public static String QRfromGoogle(String chl) throws Exception {
int widhtHeight = 300;
String EC_level = &L&;
int margin = 0;
chl = UrlEncode(chl);
String QRfromGoogle = &http://chart./chart?chs=& + widhtHeight + &x& + widhtHeight
+ &&cht=qr&chld=& + EC_level + &|& + margin + &&chl=& +
return QRfromG
} // 特殊字符处理
public static String UrlEncode(String src)
throws UnsupportedEncodingException {
return URLEncoder.encode(src, &UTF-8&).replace(&+&, &%20&);
}上面代码中涉及到几个工具类:PayConfigUtil、PayCommonUtil、HttpUtil和XMLUtil,其中PayConfigUtil放的就是上面提到一些配置及路径,PayCommonUtil涉及到了获取当前事件、产生随机字符串、获取参数签名和拼接xml几个方法,代码如下:public class PayCommonUtil {
* 是否签名正确,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
* @return boolean
public static boolean isTenpaySign(String characterEncoding, SortedMap&Object, Object& packageParams, String API_KEY) {
StringBuffer sb = new StringBuffer();
Set es = packageParams.entrySet();
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
String v = (String)entry.getValue();
if(!&sign&.equals(k) && null != v && !&&.equals(v)) {
sb.append(k + &=& + v + &&&);
sb.append(&key=& + API_KEY);
//算出摘要
String mysign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toLowerCase();
String tenpaySign = ((String)packageParams.get(&sign&)).toLowerCase();
//System.out.println(tenpaySign + &
& + mysign);
return tenpaySign.equals(mysign);
* @Description:sign签名
* @param characterEncoding
* @param parameters
public static String createSign(String characterEncoding, SortedMap&Object, Object& packageParams, String API_KEY) {
StringBuffer sb = new StringBuffer();
Set es = packageParams.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
String v = (String) entry.getValue();
if (null != v && !&&.equals(v) && !&sign&.equals(k) && !&key&.equals(k)) {
sb.append(k + &=& + v + &&&);
sb.append(&key=& + API_KEY);
String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
* @Description:将请求参数转换为xml格式的string
* @param parameters
public static String getRequestXml(SortedMap&Object, Object& parameters) {
StringBuffer sb = new StringBuffer();
sb.append(&&xml&&);
Set es = parameters.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
String v = (String) entry.getValue();
if (&attach&.equalsIgnoreCase(k) || &body&.equalsIgnoreCase(k) || &sign&.equalsIgnoreCase(k)) {
sb.append(&&& + k + &&& + &&![CDATA[& + v + &]]&&/& + k + &&&);
sb.append(&&& + k + &&& + v + &&/& + k + &&&);
sb.append(&&/xml&&);
return sb.toString();
* 取出一个指定长度大小的随机正整数.
* @param length
int 设定所取出随机数的长度。length小于11
* @return int 返回生成的随机数。
public static int buildRandom(int length) {
int num = 1;
double random = Math.random();
if (random & 0.1) {
random = random + 0.1;
for (int i = 0; i & i++) {
num = num * 10;
return (int) ((random * num));
* 获取当前时间 yyyyMMddHHmmss
* @return String
public static String getCurrTime() {
Date now = new Date();
SimpleDateFormat outFormat = new SimpleDateFormat(&yyyyMMddHHmmss&);
String s = outFormat.format(now);
}HttpUtil和XMLUtil如下:public class HttpUtil {
private static final Log logger = Logs.get();
private final static int CONNECT_TIMEOUT = 5000; // in milliseconds
private final static String DEFAULT_ENCODING = &UTF-8&;
public static String postData(String urlStr, String data){
return postData(urlStr, data, null);
public static String postData(String urlStr, String data, String contentType){
BufferedReader reader =
URL url = new URL(urlStr);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
conn.setConnectTimeout(CONNECT_TIMEOUT);
conn.setReadTimeout(CONNECT_TIMEOUT);
if(contentType != null)
conn.setRequestProperty(&content-type&, contentType);
OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), DEFAULT_ENCODING);
if(data == null)
data = &&;
writer.write(data);
writer.flush();
writer.close();
reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), DEFAULT_ENCODING));
StringBuilder sb = new StringBuilder();
String line =
while ((line = reader.readLine()) != null) {
sb.append(line);
sb.append(&\r\n&);
return sb.toString();
} catch (IOException e) {
logger.error(&Error connecting to & + urlStr + &: & + e.getMessage());
} finally {
if (reader != null)
reader.close();
} catch (IOException e) {
}public class XMLUtil {
* 解析xml,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值是子节点的xml数据。
* @param strxml
* @throws JDOMException
* @throws IOException
public static Map doXMLParse(String strxml) throws JDOMException, IOException {
strxml = strxml.replaceFirst(&encoding=\&.*\&&, &encoding=\&UTF-8\&&);
if(null == strxml || &&.equals(strxml)) {
Map m = new HashMap();
InputStream in = new ByteArrayInputStream(strxml.getBytes(&UTF-8&));
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(in);
Element root = doc.getRootElement();
List list = root.getChildren();
Iterator it = list.iterator();
while(it.hasNext()) {
Element e = (Element) it.next();
String k = e.getName();
String v = &&;
List children = e.getChildren();
if(children.isEmpty()) {
v = e.getTextNormalize();
v = XMLUtil.getChildrenText(children);
m.put(k, v);
in.close();
* 获取子结点的xml
* @param children
* @return String
public static String getChildrenText(List children) {
StringBuffer sb = new StringBuffer();
if(!children.isEmpty()) {
Iterator it = children.iterator();
while(it.hasNext()) {
Element e = (Element) it.next();
String name = e.getName();
String value = e.getTextNormalize();
List list = e.getChildren();
sb.append(&&& + name + &&&);
if(!list.isEmpty()) {
sb.append(XMLUtil.getChildrenText(list));
sb.append(value);
sb.append(&&/& + name + &&&);
return sb.toString();
}当然还有一个MD5计算工具类public class MD5Util {
private static String byteArrayToHexString(byte b[]) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i & b. i++)
resultSb.append(byteToHexString(b[i]));
return resultSb.toString();
private static String byteToHexString(byte b) {
if (n & 0)
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
public static String MD5Encode(String origin, String charsetname) {
String resultString =
resultString = new String(origin);
MessageDigest md = MessageDigest.getInstance(&MD5&);
if (charsetname == null || &&.equals(charsetname))
resultString = byteArrayToHexString(md.digest(resultString
.getBytes()));
resultString = byteArrayToHexString(md.digest(resultString
.getBytes(charsetname)));
} catch (Exception exception) {
return resultS
private static final String hexDigits[] = { &0&, &1&, &2&, &3&, &4&, &5&,
&6&, &7&, &8&, &9&, &a&, &b&, &c&, &d&, &e&, &f& };
2、支付回调支付完成后,微信会把相关支付结果和用户信息发送到我们上面指定的那个回调地址,我们需要接收处理,并返回应答。对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为15/15/30/180/00/,单位:秒)关于支付回调接口,我们首先要对于支付结果通知的内容进行签名验证,然后根据支付结果进行相应的处理流程即可。public void weixin_notify(HttpServletRequest request,HttpServletResponse response) throws Exception{
//读取参数
InputStream inputS
StringBuffer sb = new StringBuffer();
inputStream = request.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, &UTF-8&));
while ((s = in.readLine()) != null){
sb.append(s);
in.close();
inputStream.close();
//解析xml成map
Map&String, String& m = new HashMap&String, String&();
m = XMLUtil.doXMLParse(sb.toString());
//过滤空 设置 TreeMap
SortedMap&Object,Object& packageParams = new TreeMap&Object,Object&();
Iterator it = m.keySet().iterator();
while (it.hasNext()) {
String parameter = (String) it.next();
String parameterValue = m.get(parameter);
String v = &&;
if(null != parameterValue) {
v = parameterValue.trim();
packageParams.put(parameter, v);
// 账号信息
String key = PayConfigUtil.API_KEY; // key
(packageParams);
//判断签名是否正确
if(PayCommonUtil.isTenpaySign(&UTF-8&, packageParams,key)) {
//------------------------------
//处理业务开始
//------------------------------
String resXml = &&;
if(&SUCCESS&.equals((String)packageParams.get(&result_code&))){
// 这里是支付成功
//////////执行自己的业务逻辑////////////////
String mch_id = (String)packageParams.get(&mch_id&);
String openid = (String)packageParams.get(&openid&);
String is_subscribe = (String)packageParams.get(&is_subscribe&);
String out_trade_no = (String)packageParams.get(&out_trade_no&);
String total_fee = (String)packageParams.get(&total_fee&);
(&mch_id:&+mch_id);
(&openid:&+openid);
(&is_subscribe:&+is_subscribe);
(&out_trade_no:&+out_trade_no);
(&total_fee:&+total_fee);
//////////执行自己的业务逻辑////////////////
(&支付成功&);
//通知微信.异步确认成功.必写.不然会一直通知后台.八次之后就认为交易失败了.
resXml = &&xml&& + &&return_code&&![CDATA[SUCCESS]]&&/return_code&&
+ &&return_msg&&![CDATA[OK]]&&/return_msg&& + &&/xml& &;
(&支付失败,错误信息:& + packageParams.get(&err_code&));
resXml = &&xml&& + &&return_code&&![CDATA[FAIL]]&&/return_code&&
+ &&return_msg&&![CDATA[报文为空]]&&/return_msg&& + &&/xml& &;
//------------------------------
//处理业务完毕
//------------------------------
BufferedOutputStream out = new BufferedOutputStream(
response.getOutputStream());
out.write(resXml.getBytes());
out.flush();
out.close();
(&通知签名验证失败&);
}签名验证算法和签名生成的算法类似,在上面PayCommonUtil工具类中提供。三、后话感觉微信扫描支付体验效果还是挺好的,唯一缺点就是相关文档零散,官方的demo居然没有java编写的,希望之后微信官方能够逐步完善吧!最后当然是转载声明了,转载请注明:http://blog.csdn.net/wangqiuyun/article/details/没时间一一解答问题,本例子完整代码可以在 /demo/10268.html 下载!
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1394834次
积分:12109
积分:12109
排名:第1180名
原创:126篇
评论:651条
NAME:FCPlayer
CITY:Beijing
Degree:Master
Skills:Java、IOS、.NET
文章:11篇
阅读:131853
(1)(1)(1)(1)(1)(2)(2)(1)(1)(1)(2)(1)(1)(1)(1)(1)(3)(5)(6)(1)(5)(5)(5)(4)(2)(8)(5)(5)(8)(14)(16)(5)(5)(5)(3)(2)(1)(2)(3)关键字为2个最准:
广州日报微信扫码抽1元以上微信红包奖励
发布者:PoPo
广州日报微信粉丝破百万扫码抽1元以上微信红包奖励
非必中秒推,黑号不推,直接扫码即可抽取
活动截图如下
活动地址:微信扫码
24小时推荐
- 让我们的Q生活更加精彩!
Copyright (C)
, All Rights Reserved.
版权所有 皖ICP备号-3}

我要回帖

更多关于 微信公众号2微码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信