微信h5牛牛源码搭建 问题修复

需要参数 mch_id-商户号,nonce_str-随机字符串,sign-签名,前面两个参数好说,后面的 sign看得我是一脸懵逼,经过 几 次测试最后得到sign的代码是这样的:

SortedMap<String, String> datas = new TreeMap<String, String>();

String uuid = UUID.randomUUID().toString().replaceAll("-", "");

datas.put("mch_id", "你的商户号");

datas.put("nonce_str", uuid);

String sign = WXPayUtil.generateSignature(datas, "这里传商户秘钥");

WXPayUtil这个类可以直接在微信支付官网上的demo里面找到,我就懒得贴了

微信h5牛牛源码搭建   Q 2171793408   http://wowotouba.com/h5

最后得到沙箱秘钥的代码是这样的:

CloseableHttpClient closeableHttpClient = HttpClients.createDefault();

HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/sandbox/pay/getsignkey");

SortedMap<String, String> datas = new TreeMap<String, String>();

String uuid = UUID.randomUUID().toString().replaceAll("-", "");

datas.put("mch_id", "你的商户号");

datas.put("nonce_str", uuid);

String sign = WXPayUtil.generateSignature(datas, "这里传商户秘钥");

datas.put("sign", sign);

String reqeustXml = WXPayUtil.mapToXml(datas);

StringEntity postEntity = new StringEntity(reqeustXml, "UTF-8");

httpPost.addHeader("Content-Type", "text/xml");

httpPost.setEntity(postEntity);

//httpPost.setConfig(requestConfig);

CloseableHttpResponse httpResponse = closeableHttpClient.execute(httpPost);

int statusCode = httpResponse.getStatusLine().getStatusCode();

if(statusCode == 200) {

EntityUtils.toString(httpResponse.getEntity(), UTF8); //这里面返回的sign就是沙箱秘钥

}

c、好现在我们已经成功的获取了沙箱秘钥,根据微信支付文档需要先调用微信统一下单接口:https://api.mch.weixin.qq.com/pay/unifiedorder,因为是沙箱环境所以是这样的:https://api.mch.weixin.qq.com/sandboxnew/pay/unifiedorder,如果一切顺利的话,会返回一个xml的字符串,用WXPayUtil里面的方法解出来,如果下单成功会返回 result_code SUCCESS,根据文档因为是h5支付,到这一步还没有结束,还要调微信支付的页面去付款,根据文档就是 mweb_url 这个参数,所以楼主就在返回参数中傻傻的找这个参数,测了 几十遍啊,就是没有,是的没有,我记得在这个地方卡了一天吧大概,打过客服,微信客服实在是太坑,都是泪啊;后面忽然脑洞大开,怀疑沙箱环境压根就不会返回mweb_url;为了印证我这个想法,就又写了一个微信支付的查询订单的方法 :https://api.mch.weixin.qq.com/pay/orderquery 沙箱环境是这样的: https://api.mch.weixin.qq.com/sandboxnew/pay/orderquery,根据文档传相关的参数,一查果然,订单已经显示支付成功了,到这一步我真的泪奔啊。。。。;总结就是微信支付沙箱环境是不会跳支付页面的,你调沙箱的下单接口,直接就支付成功。当然这个地方因为楼主是先做的支付宝支付,它的沙箱环境跟真实环境是一样的,都是要支付的,有点先入为主了,想当然的以为微信也是这样的

微信h5牛牛源码搭建   Q 2171793408   http://wowotouba.com/h5

d、这个地方有一个需要注意的就是因为微信支付沙箱环境与真实环境不一样,同步接口需要根据沙箱环境还是真实环境进行处理,微信支付真实环境你需要把同步回调的接口地址加到mweb_url后面,微信支付成功后会回调这个地址,我的是这样写的:

String mweb_url = resultMap.get("mweb_url");

StringBuilder redirectUrlSb = new  StringBuilder();

redirectUrlSb.append(mweb_url)

.append("&")

.append("redirect_url")

.append("=")                  .append(URLEncoder.encode(properties.getWeixinpay().getPayReturnUrl(),"UTF-8"));

response.sendRedirect(redirectUrlSb.toString());

e、微信正式环境中,支付也有些问题,具体请参考:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4,微信支付文档实在是太乱,这里放一点,那里放一点。

f、还有其他的可能遇到的问题:沙箱环境是没有异步回调的、沙箱环境支付金额貌似只能是 1.01 * 100,1.02*100,微信的RMB单位是分,传其他金额,退款貌似有问题

详细咨询  Q 2171793408

官网地址:http://wowotouba.com/h5

一、场景描述

公司某工程师执行db.giveget_card.drop(),误将线上表删除。

幸好每天都有做备份,这个时候就体现了备份的重要性了,哈哈哈。。。

二、模拟故障过程

备份数据大小:


1

2

3

4


rs_test01:PRIMARY> use ycsb

switched to db ycsb

rs_test01:PRIMARY> db.giveget_card.count();

3173391

删除之前,此表有更新。


1

2

3

4

5

6

7

8


rs_test01:PRIMARY> db.giveget_card.insert({id:1});

WriteResult({ "nInserted" : 1 })

rs_test01:PRIMARY> db.giveget_card.insert({id:2});

WriteResult({ "nInserted" : 1 })

rs_test01:PRIMARY> db.giveget_card.insert({id:3});

WriteResult({ "nInserted" : 1 })

rs_test01:PRIMARY> db.giveget_card.insert({id:4});

WriteResult({ "nInserted" : 1 })

其他表也有更新操作。


1

2

3

4

5


rs_test01:PRIMARY> db.tab.find();

"_id" : ObjectId("59354ba202d9a99ab2f879c6"), "name" "a" }

"_id" : ObjectId("59354ba602d9a99ab2f879c7"), "name" "b" }

"_id" : ObjectId("59354ba802d9a99ab2f879c8"), "name" "c" }

"_id" : ObjectId("59354baa02d9a99ab2f879c9"), "name" "d" }

删除操作之后,此表和其他表都有更新。


1

2

3

4

5

6

7

8

9

10


rs_test01:PRIMARY> db.giveget_card.find();

"_id" : ObjectId("59354c28d905432aeaccd53c"), "id" : 5 }

"_id" : ObjectId("59354c2bd905432aeaccd53d"), "id" : 6 }

rs_test01:PRIMARY> db.tab.find();

"_id" : ObjectId("59354ba202d9a99ab2f879c6"), "name" "a" }

"_id" : ObjectId("59354ba602d9a99ab2f879c7"), "name" "b" }

"_id" : ObjectId("59354ba802d9a99ab2f879c8"), "name" "c" }

"_id" : ObjectId("59354baa02d9a99ab2f879c9"), "name" "d" }

"_id" : ObjectId("59354ccfd905432aeaccd542"), "name" "e" }

"_id" : ObjectId("59354cd2d905432aeaccd543"), "name" "f" }

三、恢复步骤

1、将备份中 tab 表的 giveget_card.bson 及 giveget_card.metadata.json 文件拷贝到 /tmp/restore/ycsb 目录(自建目录),ycsb 为库名。


1


# cp /data/backup/rs07/ycsb/giveget_card.* /tmp/restore/ycsb

2、将备份时间之后,误删操作之前的 oplog 导出,用于恢复表


1


# mongodump --port 2203 -d local -c oplog.rs -q ‘{"ts" : {$gte : Timestamp(1496664480, 10430), $lte : Timestamp(1496665113, 10430)}}‘ -o /tmp/oplog

--时间戳 是使用转换工具转换之后的结果。

3、使用 bsondump 查看 oplog 日志,找到 drop 操作的时间戳 1496665069


1

2

3

4

5

6

7

8

9

10

11

12


# bsondump /tmp/oplog/local/oplog.rs.bson 

{"ts":{"$timestamp":{"t":1496664760,"i":1}},"t":{"$numberLong":"12"},"h":{"$numberLong":"7079172056815894727"},"v":2,"op":"i","ns":"ycsb.giveget_card","o":{"_id":{"$oid":"59354ab8c5308d8c7a9da8b5"},"id":1.0}}

{"ts":{"$timestamp":{"t":1496664762,"i":1}},"t":{"$numberLong":"12"},"h":{"$numberLong":"-1797107728294067016"},"v":2,"op":"i","ns":"ycsb.giveget_card","o":{"_id":{"$oid":"59354abac5308d8c7a9da8b6"},"id":2.0}}

{"ts":{"$timestamp":{"t":1496664765,"i":1}},"t":{"$numberLong":"12"},"h":{"$numberLong":"8604646791509150392"},"v":2,"op":"i","ns":"ycsb.giveget_card","o":{"_id":{"$oid":"59354abdc5308d8c7a9da8b7"},"id":3.0}}

{"ts":{"$timestamp":{"t":1496664768,"i":1}},"t":{"$numberLong":"12"},"h":{"$numberLong":"9018614066505371436"},"v":2,"op":"i","ns":"ycsb.giveget_card","o":{"_id":{"$oid":"59354ac0c5308d8c7a9da8b8"},"id":4.0}}

{"ts":{"$timestamp":{"t":1496664994,"i":1}},"t":{"$numberLong":"12"},"h":{"$numberLong":"-4471524661347063602"},"v":2,"op":"c","ns":"ycsb.$cmd","o":{"create":"tab"}}

{"ts":{"$timestamp":{"t":1496664994,"i":2}},"t":{"$numberLong":"12"},"h":{"$numberLong":"-4215905958456607246"},"v":2,"op":"i","ns":"ycsb.tab","o":{"_id":{"$oid":"59354ba202d9a99ab2f879c6"},"name":"a"}}

{"ts":{"$timestamp":{"t":1496664998,"i":1}},"t":{"$numberLong":"12"},"h":{"$numberLong":"6170506962401844481"},"v":2,"op":"i","ns":"ycsb.tab","o":{"_id":{"$oid":"59354ba602d9a99ab2f879c7"},"name":"b"}}

{"ts":{"$timestamp":{"t":1496665000,"i":1}},"t":{"$numberLong":"12"},"h":{"$numberLong":"-8071456063660489895"},"v":2,"op":"i","ns":"ycsb.tab","o":{"_id":{"$oid":"59354ba802d9a99ab2f879c8"},"name":"c"}}

{"ts":{"$timestamp":{"t":1496665002,"i":1}},"t":{"$numberLong":"12"},"h":{"$numberLong":"4387884836668659146"},"v":2,"op":"i","ns":"ycsb.tab","o":{"_id":{"$oid":"59354baa02d9a99ab2f879c9"},"name":"d"}}

{"ts":{"$timestamp":{"t":1496665069,"i":1}},"t":{"$numberLong":"12"},"h":{"$numberLong":"-6913449254950935781"},"v":2,"op":"c","ns":"ycsb.$cmd","o":{"drop":"giveget_card"}}

2017-06-05T20:27:25.552+0800    10 objects found

4、将 oplog 的 bson 文件拷贝到相应目录下


1


# cp /tmp/oplog/local/oplog.rs.bson /tmp/restore/oplog.bson

此时恢复的目录结构:


1

2

3

4


# pwd

/tmp/restore

# ls

oplog.bson  ycsb

5、至此,所有的准备操作已经做完,恢复数据。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40


[[email protected] restore]# mongorestore --port 2203 --oplogReplay --oplogLimit=1496665069:1 /tmp/restore

2017-06-05T20:36:45.361+0800    building a list of dbs and collections to restore from /tmp/restore dir

2017-06-05T20:36:45.364+0800    reading metadata for ycsb.giveget_card from /tmp/restore/ycsb/giveget_card.metadata.json

2017-06-05T20:36:45.364+0800    restoring ycsb.giveget_card from /tmp/restore/ycsb/giveget_card.bson

2017-06-05T20:36:48.362+0800    [........................]  ycsb.giveget_card  15.4MB/475MB  (3.2%)

2017-06-05T20:36:51.362+0800    [#.......................]  ycsb.giveget_card  31.1MB/475MB  (6.6%)

2017-06-05T20:36:54.362+0800    [##......................]  ycsb.giveget_card  46.6MB/475MB  (9.8%)

2017-06-05T20:36:57.362+0800    [###.....................]  ycsb.giveget_card  62.1MB/475MB  (13.1%)

2017-06-05T20:37:00.362+0800    [###.....................]  ycsb.giveget_card  76.4MB/475MB  (16.1%)

2017-06-05T20:37:03.362+0800    [####....................]  ycsb.giveget_card  90.7MB/475MB  (19.1%)

2017-06-05T20:37:06.362+0800    [#####...................]  ycsb.giveget_card  105MB/475MB  (22.0%)

2017-06-05T20:37:09.362+0800    [######..................]  ycsb.giveget_card  120MB/475MB  (25.2%)

2017-06-05T20:37:12.362+0800    [######..................]  ycsb.giveget_card  133MB/475MB  (28.0%)

2017-06-05T20:37:15.362+0800    [#######.................]  ycsb.giveget_card  146MB/475MB  (30.8%)

2017-06-05T20:37:18.363+0800    [########................]  ycsb.giveget_card  163MB/475MB  (34.3%)

2017-06-05T20:37:21.362+0800    [########................]  ycsb.giveget_card  178MB/475MB  (37.4%)

2017-06-05T20:37:24.362+0800    [#########...............]  ycsb.giveget_card  196MB/475MB  (41.3%)

2017-06-05T20:37:27.362+0800    [##########..............]  ycsb.giveget_card  214MB/475MB  (45.0%)

2017-06-05T20:37:30.362+0800    [###########.............]  ycsb.giveget_card  231MB/475MB  (48.6%)

2017-06-05T20:37:33.362+0800    [############............]  ycsb.giveget_card  245MB/475MB  (51.5%)

2017-06-05T20:37:36.362+0800    [#############...........]  ycsb.giveget_card  261MB/475MB  (54.8%)

2017-06-05T20:37:39.362+0800    [##############..........]  ycsb.giveget_card  279MB/475MB  (58.7%)

2017-06-05T20:37:42.362+0800    [###############.........]  ycsb.giveget_card  297MB/475MB  (62.5%)

2017-06-05T20:37:45.362+0800    [###############.........]  ycsb.giveget_card  312MB/475MB  (65.8%)

2017-06-05T20:37:48.362+0800    [################........]  ycsb.giveget_card  328MB/475MB  (69.0%)

2017-06-05T20:37:51.362+0800    [#################.......]  ycsb.giveget_card  341MB/475MB  (71.8%)

2017-06-05T20:37:54.362+0800    [#################.......]  ycsb.giveget_card  356MB/475MB  (74.9%)

2017-06-05T20:37:57.362+0800    [##################......]  ycsb.giveget_card  373MB/475MB  (78.5%)

2017-06-05T20:38:00.362+0800    [###################.....]  ycsb.giveget_card  388MB/475MB  (81.7%)

2017-06-05T20:38:03.362+0800    [####################....]  ycsb.giveget_card  405MB/475MB  (85.2%)

2017-06-05T20:38:06.362+0800    [#####################...]  ycsb.giveget_card  419MB/475MB  (88.2%)

2017-06-05T20:38:09.362+0800    [#####################...]  ycsb.giveget_card  434MB/475MB  (91.4%)

2017-06-05T20:38:12.362+0800    [######################..]  ycsb.giveget_card  442MB/475MB  (93.1%)

2017-06-05T20:38:15.362+0800    [#######################.]  ycsb.giveget_card  459MB/475MB  (96.6%)

2017-06-05T20:38:18.362+0800    [#######################.]  ycsb.giveget_card  475MB/475MB  (99.9%)

2017-06-05T20:38:18.427+0800    [########################]  ycsb.giveget_card  475MB/475MB  (100.0%)

2017-06-05T20:38:18.427+0800    restoring indexes for collection ycsb.giveget_card from metadata

2017-06-05T20:38:44.680+0800    finished restoring ycsb.giveget_card (3173391 documents)

2017-06-05T20:38:44.680+0800    replaying oplog

2017-06-05T20:38:44.739+0800    done

6、查看恢复的结果


1

2

3

4

5

6

7


rs_test01:PRIMARY> db.giveget_card.find({id : {$gte : 1 }});

"_id" : ObjectId("59354cb9d905432aeaccd540"), "id" : 5 }

"_id" : ObjectId("59354cc0d905432aeaccd541"), "id" : 6 }

"_id" : ObjectId("59354ab8c5308d8c7a9da8b5"), "id" : 1 }

"_id" : ObjectId("59354abac5308d8c7a9da8b6"), "id" : 2 }

"_id" : ObjectId("59354abdc5308d8c7a9da8b7"), "id" : 3 }

"_id" : ObjectId("59354ac0c5308d8c7a9da8b8"), "id" : 4 }

数据内容相同,但存储顺序与之前数据的存储顺序不同了。


1

2


rs_test01:PRIMARY> db.giveget_card.count();

3173397

结果 count= 备份表数据 3173391+ 之后的更新数据 6 。

7、因为 dump 出来的 oplog 也包含了其他表的操作。查看恢复过程中有没有对其他表产生影响。


1

2

3

4

5

6

7


rs_test01:PRIMARY> db.tab.find();

"_id" : ObjectId("59354ba202d9a99ab2f879c6"), "name" "a" }

"_id" : ObjectId("59354ba602d9a99ab2f879c7"), "name" "b" }

"_id" : ObjectId("59354ba802d9a99ab2f879c8"), "name" "c" }

"_id" : ObjectId("59354baa02d9a99ab2f879c9"), "name" "d" }

"_id" : ObjectId("59354ccfd905432aeaccd542"), "name" "e" }

"_id" : ObjectId("59354cd2d905432aeaccd543"), "name" "f" }

--查看 tab 表的数据跟原表数据相同,没有什么影响,说明其他表的日志在空跑。

原文地址:https://www.cnblogs.com/blswwt/p/8508872.html

时间: 2024-10-30 04:54:33

微信h5牛牛源码搭建 问题修复的相关文章

微信h5牛牛源码出售 手机牛牛搭建图文教程

微信h5牛牛源码出售QQ:2152876294官网http://diguaym.com/h5手机17070838768神兽青龙白虎朱雀玄武凤凰大厅搭建如下: 1. 布局的时候,如果一个元素你想让他的宽高保持一定比例,而不随屏幕变化,宽高设置的时候,使用同一个单位都是CSS3的单位,低版本不兼容 <span style="font-family: Arial, sans-serif; ">1.移动端页面布局,使用相对的数值,不要使用绝对数值,推荐使用%,vw,vh,rem,e

Egret 学习笔记 h5牛牛源码 h5牛牛源码搭建教程

1.纹理集实际上就是将一些零碎的小图放到一张大图当中.游戏中也经常使用到纹理集.使用纹理集的好处很多,我们通过将大量的图片拼合为一张图片从而减少网络请求,原先加载数次的图片资源现在加载一次即可.同时,在引擎渲染的时候也会减少IO读取,从而提高h5牛牛源码性能.h5牛牛源码Q 2171793408     http://wowotouba.com/h52.只要发生事件,Flash就会调度事件对象.如果事件目标不在显示列表中,则Flash Player或AIR将事件对象直接调度到事件目标.例如,Fl

新版H5牛牛源码搭建一条龙教程

最低配置:linux服务器,系统: CentOS 6.8,内存2G以上,独享5M以上带宽 QQ:2164097691  材料下载:h5.hubawl.com 源码 <!--{template common/header}--> <!--[name]{lang portalcategory_listtplname}[/name]--> <!--{eval $list = array();}--> <!--{eval $wheresql = category_get_

h5牛牛源码搭建建站成功第一步——域名的选择

有问题Q1446595067官网:h5.haozibbs.com 一个游戏网站开始于名称和域名,大型公司对这个尤其重视,因为好的名称和相应的域名能够很好的被人记住,才能有好的访问量和多的游戏玩家. 有人说,域名是地皮,网站是楼盘,位置决定成败.在房产市场,好的地皮价格贵,随着进驻的商家越来越多,价格也就水涨船高,域名的售价不断在刷新新的记录,众多的游戏厂商们,不停的往门槛里挤,谁也不愿意输在起跑线上. 域名是棋牌游戏网站建设的第一步,选择域名需要从域名的长度.后缀.含义.优化等各个方面考虑其价值

最强微信牛牛源码搭建教程

最强微信牛牛源码搭建教程 Q 2171793408     http://wowotouba.com/h5 <head>   <meta http-equiv="Content-Type" content="text/html; charset=gbk">   <meta name="google-site-verification" content="PXunD38D6Oui1T44OkAPSLyQtFU

微信熟人牛牛源码安装+人工智能+人机融合

1.群体智能https://h5.hxforum.com基于群体编辑的维基百科.微信熟人牛牛源码安装(h5.hxforum.com) 联系方式170618633533企鹅2952777280 源码出售 房卡出售 后台出租有意者私聊扣扣基于群体开发的开源软件.基于众问众答的知识共享.基于众筹众智的万众创新.基于众包众享的共享经济等等.<规划>提出的群体智能研究方向,实质上正是综合集成研讨厅在人工智能新时代的拓展和深化.它的研究内涵不单是关注精英专家团体,而是通过互联网组织结构和大数据驱动的人工智

h5牛牛源码开发程序员是出轨率最高的群体?欲加之罪何患无辞

现代人为人处事,会自黑算是必备技能之一h5牛牛源码开发(h5.hxforum.com) 联系方式170618633533企鹅2952777280源码出售 房卡出售 后台出租有意者私聊扣扣.其原因主要有二:一是为了化解尴尬,二是缓解压力,这样集幽默与智慧于一身,大家何乐而不为?但是如今,是什么力量,让一个「从来都是自嘲不息,哪轮得到人家来黑」的程序员群体在光天化日之下就"被黑"了? 为什么程序员就成了出轨率最高的群体了?近日一篇<为什么程序员是出轨率最高的群体>的文章引发诸多

CoreCLR源码探索(七) JIT的h5牛牛源码出售工作原理(入门篇)

很多C#的初学h5牛牛源码出售Q1446595067官网:h5.haozibbs.com者都会有这么一个疑问, .Net程序代码是如何被机器加载执行的? 最简单的解答是, C#会通过编译器(CodeDom, Roslyn)编译成IL代码, 然后CLR(.Net Framework, .Net Core, Mono)会把这些IL代码编译成目标机器的机器代码并执行. 相信大多数的C#的书籍都是这样一笔带过的. 这篇和下篇文章会深入讲解JIT的具体工作流程, 和前面的GC篇一样, 实现中的很多细节都是

H5牛牛源码开发APP技术总结

Q1446595067官网:h5.haozibbs.com或http:\\www.aqbaa.cn在H5页面打开APP的方法一般有两种,在IOS 9以前,一般使用的技术是URL Scheme.这种方式虽然可自定义程度很高,能够巧妙地实现很多跳转,但弊端也很明显:我们只能通过 scheme://example 这种格式的链接来实现跳转,而且现在苹果还对这种方式的跳转加了一个提示框:"是否打开XXX".对于对Web和原生App交互的场景需求量很大的产品来说,这样的跳转方式显然是步骤冗杂的,