微信打字赚钱平台30元开发Java怎么发xml

Java SpringMVC实现PC端网页微信扫码支付完整版
一:前期微信支付扫盲知识
前提条件是已经有申请了微信支付功能的公众号,然后我们需要得到公众号APPID和微信商户号,这个分别在微信公众号和微信支付商家平台上面可以发现。其实在你申请成功支付功能之后,微信会通过邮件把Mail转给你的,有了这些信息之后,我们就可以去微信支付服务支持页面:https://pay.weixin.qq.com/service_provider/index.shtml
打开这个页面,点击右上方的链接【开发文档】会进入到API文档说明页面,看起来如下
选择红色圆圈的扫码支付就是我们要做接入方式,鼠标移动到上面会提示你去查看开发文档,如果这个都不知道怎么查看,可以洗洗睡了,你真的不合适做程序员,地址如下:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1在中打开之后会看到
我们重点要关注和的内容我已经用红色椭圆标注好了,首先阅读【接口规则】里面的协议规范,开玩笑这个都不读你就想做微信支付,这个就好比你要去泡妞,得先收集点基本背景信息,了解对方特点,不然下面还怎么沟通。事实证明只有会泡妞得程序员才是好销售。跑题了我们接下来要看一下【场景介绍】中的案例与规范,只看一下记得一定要微信支付的LOGO下载下来,是为了最后放到我们自己的扫码支付网页上,这样看上去比较专业一点。之后重点关注【模式二】
我们这里就是要采用模式二的方式实现PC端页面扫码支付功能。
微信官方对模式二的解释是这样的&商户后台先调用微信支付的统一下单接口,微信后台系统返回链接参数code_url,商户后台系统将code_url值生成二维码图片,用户使用微信客户端扫码后发起支付。注意:code_url有效期为2小时,过期后扫码不能再发起支付&。看明白了吧就是我们首先要调用微信提供统一下单接口,得到一个关键信息code_url(至于这个code_url是什么鬼,我也不知道),然后我们通过自己的程序把这个URL生成一个二维码,生成二维码我这里用了Google的zxing库。然后把这个二维码显示在你的PC端网页上就行啦。这样终端用户一扫码就支付啦,支付就完成啦,看到这里你肯定很激动,发现微信支付如此简单,等等还有个事情我们还不知道,客户知道付钱了,我们服务器端还不知道呢,以微信开发人员的智商他们早就想到这个问题了,所以让你在调用统一下单接口的时候其中有个必填的参数就是回调URL,就是如果客户端付款成功之后微信会通过这个URL向我们自己的服务器提交一些数据,然后我们后台解析这些数据,完成我们自己操作。这样我们才知道客户是否真的已经通过微信付款了。这样整个流程才结束,这个就是模式二。微信用一个时序图示这样表示这个过程的。
表达起来比较复杂,看上去比较吃力,总结一下其实我们服务器该做的事情就如下件:
1. 通过统一下单接口传入正确的参数(当然要包括我们的回调URL)与签名验证,从返回数据中得到code_url的对应数据
2. 根据code_url的数据我们自己生成一个二维码图片,显示在浏览器网页上
3. 在回调的URL中添加我们自己业务逻辑处理。
至此扫盲结束了,你终于知道扫码支付什么个什么样的流程了,下面我们就一起来扒扒它的相关API使用,做好每步处理。
二:开发过程
在开发代码之前,请先准备几件事情。
1. 添加ZXing的maven依赖
2. 添加jdom的maven依赖
3.下载版本SDK演示程序,地址在这里
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1
我们需要MD5Util.java和XMLUtil.java两个文件
4. 我们使用HttpClient版本是4.5.1,记得添加Maven依赖
上面准备工作做好以后,继续往下看:
首先我们要调用微信的统一下单接口,我们点击【API列表】中的统一下单会看到这样页面:
以本人调用实际情况为例,如下的参数是必须要有的,为了大家的方便我已经把它变成一个POJO的对象, 代码如下:
public class UnifiedorderDto implements WeiXinConstants {
private String device_
private String mch_
private String nonce_
private String notify_
private String openId;
private String out_trade_
private String spbill_create_
private int total_
private String trade_
private String product_
public UnifiedorderDto() {
this.appid = APPID;
this.mch_id = WXPAYMENTACCOUNT;
this.device_info = DEVICE_INFO_WEB;
this.notify_url = CALLBACK_URL;
this.trade_type = TRADE_TYPE_NATIVE;
public String getAppid() {
public void setAppid(String appid) {
this.appid =
public String getBody() {
public void setBody(String body) {
this.body =
public String getDevice_info() {
return device_
public void setDevice_info(String device_info) {
this.device_info = device_
public String getMch_id() {
return mch_
public void setMch_id(String mch_id) {
this.mch_id = mch_
public String getNonce_str() {
return nonce_
public void setNonce_str(String nonce_str) {
this.nonce_str = nonce_
public String getNotify_url() {
return notify_
public void setNotify_url(String notify_url) {
this.notify_url = notify_
public String getOpenId() {
return openId;
public void setOpenId(String openId) {
this.openId = openId;
public String getOut_trade_no() {
return out_trade_
public void setOut_trade_no(String out_trade_no) {
this.out_trade_no = out_trade_
public String getSpbill_create_ip() {
return spbill_create_
public void setSpbill_create_ip(String spbill_create_ip) {
this.spbill_create_ip = spbill_create_
public int getTotal_fee() {
return total_
public void setTotal_fee(int total_fee) {
this.total_fee = total_
public String getTrade_type() {
return trade_
public void setTrade_type(String trade_type) {
this.trade_type = trade_
public String getSign() {
public void setSign(String sign) {
this.sign =
public String getProduct_id() {
return product_
public void setProduct_id(String product_id) {
this.product_id = product_
public String generateXMLContent() {
String xml = && +
&& + this.appid + && +
&& + this.body + && +
&& + this.mch_id + && +
&& + this.nonce_str + && +
&& + this.notify_url + && +
&& + this.out_trade_no + && +
&& + this.product_id + && +
&& + this.spbill_create_ip+ && +
&& + String.valueOf(this.total_fee) + && +
&& + this.trade_type + && +
&& + this.sign + && +
public String makeSign() {
String content =&appid=& + this.appid +
&&body=& + this.body +
&&device_info=WEB& +
&&mch_id=& + this.mch_id +
&&nonce_str=& + this.nonce_str +
&?ify_url=& + this.notify_url +
&&out_trade_no=& + this.out_trade_no +
&&product_id=& + this.product_id +
&&spbill_create_ip=& + this.spbill_create_ip+
&&total_fee=& + String.valueOf(this.total_fee) +
&&trade_type=& + this.trade_
content = content + &&key=& + WeiXinConstants.MD5_API_KEY;
String esignature = WeiXinPaymentUtil.MD5Encode(content, &utf-8&);
return esignature.toUpperCase();
其中各个成员变量的解释可以参见【统一下单接口】的说明即可。
有这个之后我们就要要设置的内容填写进去,去调用该接口得到返回数据,从中拿到code_url的数据然后据此生成一个二维图片,把图片的地址返回给PC端网页,然后它就会显示出来,这里要特别说明一下,我们自己PC端网页在点击微信支付的时候就会通过ajax方式调用我们自己后台的SpringMVC Controller然后在Controller的对应方法中通过HTTPClient完成对微信统一下单接口调用解析返回的XML数据得到code_url的值,生成二维码之后返回给前台网页。Controller中实现的代码如下:
Map result=new HashMap();
UnifiedorderDto dto = new UnifiedorderDto();
if(cash == null || &&.equals(cash)) {
result.put(&error&, &cash could not be zero&);
int totalfee = 100*Integer.parseInt(cash);
logger.info(&total recharge cash : & + totalfee);
dto.setProduct_id(String.valueOf(System.currentTimeMillis()));
dto.setBody(&repair&);
dto.setNonce_str(String.valueOf(System.nanoTime()));
LoginInfo loginInfo = LoginInfoUtil.getLoginInfo();
// 通过我们后台订单号+UUID为身份识别标志
dto.setOut_trade_no(&你的订单号+关键信息,微信回调之后传回,你可以验证&);
dto.setTotal_fee(totalfee);
dto.setSpbill_create_ip(&127.0.0.1&);
// generate signature
dto.setSign(dto.makeSign());
logger.info(&sign : & + dto.makeSign());
logger.info(&xml content : & + dto.generateXMLContent());
HttpClient httpClient = HttpClientBuilder.create().build();
HttpPost post = new HttpPost(WeiXinConstants.UNIFIEDORDER_URL);
post.addHeader(&Content-Type&, &text/ charset=UTF-8&);
StringEntity xmlEntity = new StringEntity(dto.generateXMLContent(), ContentType.TEXT_XML);
post.setEntity(xmlEntity);
HttpResponse httpResponse = httpClient.execute(post);
String responseXML = EntityUtils.toString(httpResponse.getEntity(), &UTF-8&);
logger.info(&response xml content : & + responseXML);
// parse CODE_URL CONTENT
Map resultMap = (Map)XMLUtil.doXMLParse(responseXML);
logger.info(&response code_url : & + resultMap.get(&code_url&));
String codeurl = resultMap.get(&code_url&);
if(codeurl != null && !&&.equals(codeurl)) {
String imageurl = generateQrcode(codeurl);
result.put(&QRIMAGE&, imageurl);
post.releaseConnection();
} catch(Exception e) {
e.printStackTrace();
result.put(&success&, &1&);
生成二维码的代码如下:
private String generateQrcode(String codeurl) {
File foldler = new File(basePath + &qrcode&);
if(!foldler.exists()) {
foldler.mkdirs();
String f_name = UUIDUtil.uuid() + &.png&;
File f = new File(basePath + &qrcode&, f_name);
FileOutputStream fio = new FileOutputStream(f);
MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
Map hints = new HashMap();
hints.put(EncodeHintType.CHARACTER_SET, &UTF-8&); //设置字符集编码类型
BitMatrix bitMatrix =
bitMatrix = multiFormatWriter.encode(codeurl, BarcodeFormat.QR_CODE, 300, 300,hints);
BufferedImage image = toBufferedImage(bitMatrix);
//输出二维码图片流
ImageIO.write(image, &png&, fio);
return (&qrcode/& + f_name);
} catch (Exception e1) {
e1.printStackTrace();
此时如何客户端微信扫码之后,微信就会通过回调我们制定URL返回数据给我们。在回调方法中完成我们自己的处理,这里要特别注意的是你的回调接口必须通过HTTP POST方法实现,否则无法接受到XML数据。回调处理的代码如下:
@RequestMapping(value = &/your_callback_url&, method = RequestMethod.POST)
@ResponseBody
public void finishPayment(HttpServletRequest request, HttpServletResponse response) {
logger.info(&start to callback from weixin server: & + request.getRemoteHost());
Map&string, string=&&& resultMap = new HashMap&string, string=&&&();
InputStream inputStream = request.getInputStream();
// 读取输入流
SAXBuilder saxBuilder= new SAXBuilder();
Document document = saxBuilder.build(inputStream);
// 得到xml根元素
Element root = document.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);
resultMap.put(k, v);
// 验证签名!!!
String[] keys = resultMap.keySet().toArray(new String[0]);
Arrays.sort(keys);
String kvparams = &&;
for(int i=0; i&keys. i++)=&& {=&& if(keys[i].equals(&esign&))=&&=&& }=&& 签名算法=&& if(i=&=& 0)=&& kvparams=&& +=&(keys[i]& &=& + resultMap.get(keys[i]));
kvparams += (& &&=&& keys[i]=&& &key=& + WeiXinConstants.MD5_API_KEY;
String md5esign = WeiXinPaymentUtil.MD5Encode(esign, & utf-8&);=&& if(!md5esign.equals(resultmap.get(&sign&)))=&&=&& }*=&& 关闭流=&& 释放资源=&& inputstream.close();=&& inputstream=&& string=&& returncode=&resultMap.get(&return_code&);& outtradeno=&resultMap.get(&out_trade_no&);& 以分为单位=&& int=&& nfee=&Integer.parseInt(resultMap.get(&total_fee&));& logger.info(&out=&& trade=&& no=&& :=&& outtradeno);=&& logger.info(&total_fee=&& nfee);=&& 业务处理流程=&& if(&success&.equals(returncode))=&& todo:=&& your=&& business=&& process=&& add=&& here=&& response.getwriter().print(xmlutil.getretresultxml(resultmap.get(&return_code&),=&& resultmap.get(&return_code&)));=&& else=&& resultmap.get(&return_msg&)));=&& catch(ioexception=&& ioe)=&& ioe.printstacktrace();=&& catch=&& (jdomexception=&& e1)=&& e1.printstacktrace();=&& }
微信官方java版demo用到的xmlutil和md5util的两个类记得拿过来改一下,演示代码可以在它的官方演示页面找到,相关maven依赖如下:
com.google.zxing
最后要特别注意的是关于签名,签名生成MD5的类我是从微信官网直接下载Java版Demo程序获取的,建议你也是,因为这个是确保MD5签名是一致的最佳选择。具体的生成签名的算法可以查看微信官方文档,这里也强烈建议大家一定要官方API说明,你开发中所遇到各种问题90%都是因为不看官方文档,而是轻信某人博客!这个才是我写这篇文章的真正目的和用意,根据官方文档,用我的Java代码实现,微信PC端网页扫码支付必定在你的WEB应用中飞起来。扫一扫体验手机阅读
微信公众号支付中出现XML数据异常的问题
<span type="1" blog_id="1916099" userid='
12篇文章,2W+人气,0粉丝
企业级网安运维
¥51.0063人订阅
鸟瞰Web应用开发
¥51.0026人订阅
<span type="1" blog_id="1916099" userid='微信公众号开发之如何实现消息交互 - 简书
微信公众号开发之如何实现消息交互
微信开发交流群:
系列文章参考地址
欢迎留言、转发、打赏
项目源码参考地址
前几篇文章已讲完如何导入项目,如何启动配置项目,如何成为开发者(如果前三项不会的看这里 。这篇文章就来讲讲如果实现消息交互
总所周知Jfinal 开发中配置非常简单只要在web.xml中添加如下代码就可以将所有的请求交由Jfianl处理
&?xml version="1.0" encoding="UTF-8"?&
&web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"&
&filter-name&jfinal&/filter-name&
&filter-class&com.jfinal.core.JFinalFilter&/filter-class&
&async-supported&true&/async-supported&
&init-param&
&param-name&configClass&/param-name&
&param-value&com.javen.common.APPConfig&/param-value&
&/init-param&
&filter-mapping&
&filter-name&jfinal&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
&/web-app&
可以看到com.javen.common.APPConfig 是项目的核心配置文件,他是继承自JFinalConfig 实现了如下方法
消息交互-配置详解.png
这篇文章中讲到过消息交互都是由WeixinMsgController接管的,
消息到底是如何交互的在此做详细的讲解
上面有讲到消息交互都是由WeixinMsgController接管的,她是继承自MsgControllerAdapter 又继承自 MsgController 里面有个index 方法其中上面的拦截器MsgInterceptor是进行加密验证的(成为开发者模式),验证没有问题就执行index方法,如下图
消息交互-接收消息.png
可以看出接收消息并返回一个InMsg,之后根据信息类型调用对应的抽象方法交给实现方式实现消息的处理。
那么问题来了:
1、如何接收微信交互的xml
2、如何处理微信的各种消息
3、如何响应微信的各种消息
接收微信交互的xml
成功开发者(get请求)之后,所有的消息接收处理都交由开发者url处理(post请求)所以就有一下方法获取xml
@Before({NotAction.class})
public String getInMsgXml() {
if(this.inMsgXml == null) {
this.inMsgXml = HttpKit.readData(this.getRequest());
if(ApiConfigKit.getApiConfig().isEncryptMessage()) {
this.inMsgXml = MsgEncryptKit.decrypt(this.inMsgXml, this.getPara("timestamp"), this.getPara("nonce"), this.getPara("msg_signature"));
if(StrKit.isBlank(this.inMsgXml)) {
throw new RuntimeException("请不要在浏览器中请求该连接,调试请查看WIKI:http://git.oschina.net/jfinal/jfinal-weixin/wikis/JFinal-weixin-demo%E5%92%8C%E8%B0%83%E8%AF%95");
return this.inMsgX
解析微信的各种消息
@Before({NotAction.class})
public InMsg getInMsg() {
if(this.inMsg == null) {
this.inMsg = InMsgParser.parse(this.getInMsgXml());
return this.inM
可以看到this.inMsg 为null时会解析InMsgParser.parse(this.getInMsgXml());获取到的xml
public static InMsg parse(String xml) {
XmlHelper xmlHelper = XmlHelper.of(xml);
return doParse(xmlHelper);
静态方法 通过xml 实例化一个XmlHelper(主要提供一些常用类型数据的获取方法) 再交给doParse方法处理 text消息 image消息 voice消息 vide消息 shortvideo消息 location消息 link消息 eveen消息
private static InMsg doParse(XmlHelper xmlHelper) {
String toUserName = xmlHelper.getString("//ToUserName");
String fromUserName = xmlHelper.getString("//FromUserName");
Integer createTime = Integer.valueOf(xmlHelper.getNumber("//CreateTime").intValue());
String msgType = xmlHelper.getString("//MsgType");
if("text".equals(msgType)) {
return parseInTextMsg(xmlHelper, toUserName, fromUserName, createTime, msgType);
} else if("image".equals(msgType)) {
return parseInImageMsg(xmlHelper, toUserName, fromUserName, createTime, msgType);
} else if("voice".equals(msgType)) {
return parseInVoiceMsgAndInSpeechRecognitionResults(xmlHelper, toUserName, fromUserName, createTime, msgType);
} else if("video".equals(msgType)) {
return parseInVideoMsg(xmlHelper, toUserName, fromUserName, createTime, msgType);
} else if("shortvideo".equals(msgType)) {
return parseInShortVideoMsg(xmlHelper, toUserName, fromUserName, createTime, msgType);
} else if("location".equals(msgType)) {
return parseInLocationMsg(xmlHelper, toUserName, fromUserName, createTime, msgType);
} else if("link".equals(msgType)) {
return parseInLinkMsg(xmlHelper, toUserName, fromUserName, createTime, msgType);
} else if("event".equals(msgType)) {
return parseInEvent(xmlHelper, toUserName, fromUserName, createTime, msgType);
LogKit.error("无法识别的消息类型 " + msgType + ",请查阅微信公众平台开发文档");
return parseInNotDefinedMsg(toUserName, fromUserName, createTime, msgType);
解析出来消息类型之后就调用对应的解析方法并返回InMsg。
消息类型很多避免重复造轮子,所以就诞生了消息的封装这个东西。
查看所有普通消息的xml格式找规律进行封装
可以发现都包含有ToUserName FromUserName CreateTime MsgId
不同的是 MsgType 以及 各个类型对应的消息内容。
这里是接收消息以及响应消息的截图
消息交互-消息封装.png
以解析 text消息 为栗子讲解
接收到的xml 如下
&ToUserName&&![CDATA[toUser]]&&/ToUserName&
&FromUserName&&![CDATA[fromUser]]&&/FromUserName&
&CreateTime&&/CreateTime&
&MsgType&&![CDATA[text]]&&/MsgType&
&Content&&![CDATA[this is a test]]&&/Content&
&MsgId&3456&/MsgId&
解析text消息
private static InMsg parseInTextMsg(XmlHelper xmlHelper, String toUserName, String fromUserName, Integer createTime, String msgType) {
InTextMsg msg = new InTextMsg(toUserName, fromUserName, createTime, msgType);
msg.setContent(xmlHelper.getString("//Content"));
msg.setMsgId(xmlHelper.getString("//MsgId"));
封装text消息
public class InTextMsg extends InMsg {
private String msgId;
public InTextMsg(String toUserName, String fromUserName, Integer createTime, String msgType) {
super(toUserName, fromUserName, createTime, msgType);
public String getContent() {
return this.
public void setContent(String content) {
this.content =
public String getMsgId() {
return this.msgId;
public void setMsgId(String msgId) {
this.msgId = msgId;
接收消息的公用部分
public abstract class InMsg {
protected String toUserN
protected String fromUserN
protected Integer createT
protected String msgT
public InMsg(String toUserName, String fromUserName, Integer createTime, String msgType) {
this.toUserName = toUserN
this.fromUserName = fromUserN
this.createTime = createT
this.msgType = msgT
public String getToUserName() {
return this.toUserN
public void setToUserName(String toUserName) {
this.toUserName = toUserN
public String getFromUserName() {
return this.fromUserN
public void setFromUserName(String fromUserName) {
this.fromUserName = fromUserN
public Integer getCreateTime() {
return this.createT
public void setCreateTime(Integer createTime) {
this.createTime = createT
public String getMsgType() {
return this.msgT
public void setMsgType(String msgType) {
this.msgType = msgT
响应微信的各种消息
由上分析可以知道,消息处理完成后都是交由抽象方法的实现方法处理消息。MsgControllerAdapter 主要是适配各种消息的抽象类。
下面 text消息为例子说明
接收到text消息之后会调用 WeixinMsgController中的protected void processInTextMsg(InTextMsg inTextMsg) 方法,可以通过InTextMsg对象获取text消息
protected void processInTextMsg(InTextMsg inTextMsg)
String msgContent = inTextMsg.getContent().trim();
// 帮助提示
if ("help".equalsIgnoreCase(msgContent) || "帮助".equals(msgContent)) {
OutTextMsg outMsg = new OutTextMsg(inTextMsg);
outMsg.setContent(helpStr);
render(outMsg);
renderOutTextMsg("你发的内容为:"+msgContent);
//转发给多客服PC客户端
OutCustomMsg outCustomMsg = new OutCustomMsg(inTextMsg);
render(outCustomMsg);
以上可以看到响应消息有两种实现方式
第一种render一个消息对象
OutTextMsg outMsg = new OutTextMsg(inTextMsg);
outMsg.setContent(helpStr);
render(outMsg);
第二种直接传一个String
renderOutTextMsg("你发的内容为:"+msgContent);
以下是具体的实现:
1、将对象转化为xml outMsg.toXml()
2、如果是开发模式输出调试的xml
3、如果是加密模式,就将消息加密
4、通过Jfinal 的renderText()方法应用xml
public void render(OutMsg outMsg) {
String outMsgXml = outMsg.toXml();
if(ApiConfigKit.isDevMode()) {
System.out.println("发送消息:");
System.out.println(outMsgXml);
System.out.println("--------------------------------------------------------------------------------\n");
if(ApiConfigKit.getApiConfig().isEncryptMessage()) {
outMsgXml = MsgEncryptKit.encrypt(outMsgXml, this.getPara("timestamp"), this.getPara("nonce"));
this.renderText(outMsgXml, "text/xml");
而renderOutTextMsg(String content)方法就是调用的render(outMsg)方法
public void renderOutTextMsg(String content) {
OutTextMsg outMsg = new OutTextMsg(this.getInMsg());
outMsg.setContent(content);
this.render(outMsg);
欢迎留言、转发、打赏
项目源码参考地址
专注Android、微信开发。公众号javenlife
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
本篇技术博客来自Worktile 微信之父 @龚林杰的动情分享,为您详细讲述我们微信公众号【getworktile】背后的点点滴滴~ 现如今,微信已经不再只承担着交流沟通、娱乐大众的功能,微信公众号的推出将微信逐渐转变成个人、商家、企业单位用来营销的重要工具。而微信推出的公...
发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注
09:45字数 61697阅读 3316评论 2喜欢 85 用到的组件 1、通过CocoaPods安装 项目名称 项目信息 AFNetworking 网络请求组件 FM...
下午放学去接闺女上英语辅导班,我送去闺女就回家做饭了,因为英语辅导班离我家很近的,闺女上完英语课已经6点多了,自己走回家,她回家我已经做好饭了,我叫她吃完饭再写作业,闺女说:“妈妈今天的作业不多写完作业再吃吧。”闺女一直以来不管老师布...
219期脱靶,这期加油! 220期:金胆:
五码复式: (含组三)
和值:13 17 21 23
杀和值:05.08.15.18.25 杀两码组合:07.20.11.26.53.15.17.57...
四楼老刘家孩子,让媳妇拿医保卡买药,媳妇去了,没买,小刘说咋空手回来?媳妇说卡上只有三块钱!你妈也是,一买都是上千块钱的药,卡上没钱也不说一声!小刘坐着一声不吭! 第二天,小刘买了身衣服,他妈大声小气的说孩儿,别乱花钱,小刘忍了半天说买药不花钱。他妈脸红了没说话。趁没人,塞...
《相思》 从别后,忆相逢,几回魂梦与君同。 心连心,盼相守,望眼欲穿君归兮。--芯莹 如果是缘份惹的祸让我受折磨着了魔,我想这些都是情路的过客,情海深处无法解脱,不要说是你的错,不要说你真心爱着我...,情海之中让我去漂泊,愿你天天快乐,多年之后你还会记得我...。 相思无...}

我要回帖

更多关于 微信打字赚钱平台30元 的文章

更多推荐

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

点击添加站长微信