需要参数 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
一、场景描述
公司某工程师执行db.giveget_card.drop(),误将线上表删除。
幸好每天都有做备份,这个时候就体现了备份的重要性了,哈哈哈。。。
二、模拟故障过程
备份数据大小:
1 2 3 4 |
rs_test01:PRIMARY> use ycsb
|
删除之前,此表有更新。
1 2 3 4 5 6 7 8 |
rs_test01:PRIMARY> db.giveget_card.insert({ id :1});
|
其他表也有更新操作。
1 2 3 4 5 |
rs_test01:PRIMARY> db.tab. find ();
|
删除操作之后,此表和其他表都有更新。
1 2 3 4 5 6 7 8 9 10 |
rs_test01:PRIMARY> db.giveget_card. find ();
|
三、恢复步骤
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
|
4、将 oplog 的 bson 文件拷贝到相应目录下
1 |
# cp /tmp/oplog/local/oplog.rs.bson /tmp/restore/oplog.bson
|
此时恢复的目录结构:
1 2 3 4 |
# pwd
|
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
|
6、查看恢复的结果
1 2 3 4 5 6 7 |
rs_test01:PRIMARY> db.giveget_card. find ({ id : {$gte : 1 }});
|
数据内容相同,但存储顺序与之前数据的存储顺序不同了。
1 2 |
rs_test01:PRIMARY> db.giveget_card.count();
|
结果 count= 备份表数据 3173391+ 之后的更新数据 6 。
7、因为 dump 出来的 oplog 也包含了其他表的操作。查看恢复过程中有没有对其他表产生影响。
1 2 3 4 5 6 7 |
rs_test01:PRIMARY> db.tab. find ();
|
--查看 tab 表的数据跟原表数据相同,没有什么影响,说明其他表的日志在空跑。
原文地址:https://www.cnblogs.com/blswwt/p/8508872.html