myeclipse工程环境出错:Set project compiler compliance settings to ‘1.5’

工程编译出现问题,提示Set project compiler compliance settings to ‘1.5’

解决方案:右击项目–>properties–>Java compiler –>选择enabel project specific setting –>Compiler compliance level :选择1.7版本,其他默认

=============================================================================================================

add deployment点击没有反应,有可能是应为项目的属性没有配置好,进入到properties配置页面搜索web项,将Context Root标签下Web-root folder设置为src/main/webapp

将Web Context-Root设置为/xxxx,点击ok,然后可以add deployment了。

用getHibernateTemplate().save()保存一条记录到表时,字段的默认值无效

问题描述:
hibernate技术中对应数据库中每一个表,都会有一个映射文件与之对应,此文件描述数据库表中每一个字段的类型、长度、是否可空等属性。在进行表中记录的插入(更新)操作时,hibernate会根据映射文件中的描述自动生成一个包含所有字段的插入(更新)sql语句,此时如果映射文件中某字段的值为空(NULL)而其在数据库表中定义的默认值不为空,hibernate会将空值插入到表中,而不会使用此字段的默认值。

解决方法:
在hibernate映射文件对数据库表的描述中,加入dynamic-insert=”true”和 dynamic-update=”true” 语句,这时hibernate在进行插入(更新)操作时,只会为那些值不为空的字段赋值,而值为空的字段就会使用数据库表中定义的默认值了。

举例说明:
表person:
CREATE TABLE person (
i_id int(11) NOT NULL auto_increment,
c_name varchar(100) NOT NULL default ‘张三’,
PRIMARY KEY  (id)
)

person.hbm.xml:
<hibernate-mapping package=”cn.com.lough.model”>
<class
name=”Person”
table=”person”
lazy=”false”
>
<meta attribute=”sync-DAO”>true</meta>
<cache usage=”read-write”/>
<id
name=”IId”
type=”integer”
column=”i_id”
>
<generator class=”native”/>
</id>

<property
name=”CName”
column=”c_name”
type=”string”
not-null=”false”
length=”128″
/>
</hibernate-mapping>

运行程序
Person p = new Person();
HiFactory.save(p);

此时hibernate生成的sql语句为insert into person(c_name) values(null);

数据库表结果为
i_id   c_name
1      null

修改person.hbm.xml为:
<hibernate-mapping package=”cn.com.lough.model”>
<class
name=”Person”
table=”person”
lazy=”false”
dynamic-insert=”true”
>
<meta attribute=”sync-DAO”>true</meta>
<cache usage=”read-write”/>
<id
name=”IId”
type=”integer”
column=”i_id”
>
<generator class=”native”/>
</id>

<property
name=”CName”
column=”c_name”
type=”string”
not-null=”false”
length=”128″
/>
</hibernate-mapping>

再次运行程序,此时hibernate生成的sql语句为 insert into person() values();
数据库表结果为
i_id   c_name
1      null
2      张三

微信扫码支付成功后跳转

问题描述

微信官方提供的示例中支付扫码页只有二维码图,支付成功后没有任何交互为了更好的用户体验希望扫码支付成功后自动跳转到支付成功页。

解决方案

通过setInterval定时ajax查询订单状态,如果订单支付成功则跳转。

示例代码

[javascript] view plain copy

  1. <script language=javascript>
  2.     var int=self.setInterval(“orderStatus()”,5000)
  3.     function orderStatus()
  4.     {
  5.         $.post(“<?= url::to([‘/order/order/orderstatus’])?>”,
  6.             {
  7.                 orderCode:“<?= $orderCode?>”
  8.             },
  9.             function(data,status){
  10.                 if(data.state==‘success’&&data.data==‘paid’){
  11.                     location.href = “<?= url::to([‘/order/order/return’,’orderCode’=>$orderCode])?>”;
  12.                 }
  13.             });
  14.     }
  15. </script>
作者:xiong
链接:https://www.zhihu.com/question/30355733/answer/88476787
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

$(document).ready(function () { setInterval(“ajaxstatus()”, 3000); }); function ajaxstatus() { if ($(“#out_trade_no”).val() != 0) { $.ajax({ url: “URL?tradeno=” + $(“#out_trade_no”).val(), type: “GET”, dataType:”json”, data: “”, success: function (data) { // alert(data); if (data==1) { //订单状态为1表示支付成功 window.location.href = “wxScanSuccessUrl.action”; //页面跳转 } }, error: function () { alert(“请求订单状态出错”); } }); } }

Java/Jsp中让数值不使用科学计数法显示的解决方案

1.在java后台中进行转换

(1)使用BigDecimal类

double num=8.8888888E10;
String str=new BigDecimal(num).toString();
参考用法:参考

(2)使用DecimalFormat类

double num=8.8888888E10;
String str=new DecimalFormat(“0.00”).format(num);
参考用法:参考

2.在jsp页面中进行转换

(1)使用jstl标签fmt:formatNumber

导入:<%@ taglib uri=”http://java.sun.com/jsp/jstl/fmt” prefix=”fmt”%>
使用 :<fmt:formatNumber value=”8.8888888E10″ pattern=”#.##” minFractionDigits=”2″ > </fmt:formatNumber>
参考用法:参考

(2)使用js脚本

var num=8.8888888E10;
var str=parseFloat(num).toString();

SQL Server 口令密码对照表

http://wenku.baidu.com/link?url=D8XSnDkjUo3ELoWPg8YiOix3FYteymYEvuT5a4DOs9KJrvaGmGlgYUCs7QbhtdD6vsgYvJFjX2GGDJbZrX09clpJdwb8K0BVmP6oJs5MJLe

 

a 0xb3  b 0x83  c 0x93  d 0xe3  e 0xf3  f 0xc3  g 0xd3  h 0x23  i 0x33  j 0x03  k 0x13  l 0x63  m 0x73  n 0x43  o 0x53  p 0xa2

q 0xb2  r 0x82  s 0x92  t 0xe2  u 0xf2  v 0xc2  w 0xd2  x 0x22  y 0x32  z 0x02  1 0xb6  2 0x86  3 0x96  4 0xe6  5 0xf6  6 0xc6  7 0xd6  8 0x26  9 0x36  0 0xa6  – 0x77  = 0x76  \ 0x60  [ 0x10  ] 0x70  ‘ 0xd7  , 0x67  . 0x47  / 0x57  ` 0xa3  ! 0xb7  @ 0xa1  # 0x97  $ 0xe7

% 0xf7  ^ 0x40  & 0xc7  * 0x07  ( 0x27  ) 0x37  A 0xb1  B 0x81  C 0x91  D 0xe1  E 0xf1  F 0xc1  G 0xd1  H 0x21  I 0x31  J 0x01  K 0x11  L 0x61  M 0x71  N 0x41  O 0x51  P 0xa0  Q 0xb0  R 0x80  S 0x90  T 0xe0  U 0xf0  V 0xc0  W 0xd0  X 0x20  Y 0x30  Z 0x00  _ 0x50  + 0x17

| 0x62  { 0x12  } 0x72  : 0x06  ” 0x87  < 0x66  > 0x46  ? 0x56  ~ 0x42  ; 不存在

微信支付开发服务商版那些坑

首先说一下服务商版,可以到这里看看介绍 https://pay.weixin.qq.com/service_provider/index.shtml

服务商版的微信支付开发文档在这里 https://pay.weixin.qq.com/wiki/doc/api/sl.html

这里主要说一下从原来的普通的账号转变为接入服务商要做哪些改变

  1. 这是第一个注意的地方
    以刷卡支付为例,可以对比看到,多了两个参数sub_appid,sub_mch_id,这两个参数填你原来账号的。
    而appid,mch_id填服务商的,服务商会给你的
  2. 如果是微信公众账号内h5支付
    要求传openid和sub_openid,这里只传sub_openid即可,内容填以前获取的openid,不变
  3. 另外,再提醒下,微信app支付比较特殊,它的appid和其它的支付使用的appid是不相同的
    微信app支付的appid去open.weixin.qq.com查看
    而其它的支付的appid去mp.weixin.qq.com查看
  4. 加密(重点)
    加密使用商户给的key,自己以前的key已经无效了。
  5. 支付目录
    开通商户后,商户会叫你提供appid和支付目录,这时自己设置的支付目录已经无效。
    注意区分正式目录和测试目录,若使用测试目录,必须要把个人微信号填入白名单切必须要在微信公众账号里打开支付链接。

微信h5统一下单请求示例如下

<appid>wxf62dxxxxxxxx</appid>
  <sub_appid>wxa1axxxxxxx</sub_appid>
  <mch_id>12948xxxxxx</mch_id>
  <sub_mch_id>12953xxxxx</sub_mch_id>
  <device_info>WEB</device_info>
  <nonce_str>ldriuwwskcse2f3p19oz9ah8pzgphpxq</nonce_str>
  <sign>1A44A6360FFA98CF80E749xxxxxxx</sign>
  <body>xxx订单</body>
  <detail></detail>
  <attach>http://xxx.com/notify</attach>
  <out_trade_no>14533694xxxxx</out_trade_no>
  <fee_type></fee_type>
  <total_fee>650</total_fee>
  <spbill_create_ip>8.8.8.8</spbill_create_ip>
  <time_start></time_start>
  <time_expire></time_expire>
  <goods_tag></goods_tag>
  <notify_url>http://xxx.com/wxpay/notify</notify_url>
  <trade_type>JSAPI</trade_type>
  <product_id></product_id>
  <limit_pay></limit_pay>
  <openid></openid>
  <sub_openid>oEGaBuE9qX-YhQvxxxxxxxx</sub_openid>

微信支付收银端解决方案总结

伴随微信支付用户数和线下门店数的节节攀升,越来越多的服务商(包括跨境服务商)也已捕捉到商机,加入到了微信支付的行列。

笔者在和服务商的对接中发现,很多服务商擅长软件开发,却没有线下接入商户门店的经验,在收银端碰壁,不知道如何下手。经常会问到:

我们的软件如何和商户系统整合?

我们需要扫码器吗?

需要POS机吗?

收银端如何和微信支付的服务器联调?

收银端到底有哪些解决方案?

和微信服务器对接的网络架构通常是怎么样的?

在此,笔者简单总结收银端的解决方案,希望能帮助到在这方面有困惑的技术人员。

开始之前,可以先了解下比较常见的微信支付接入网络拓扑图。

干货|微信支付收银端解决方案总结

如图所示,各个商户门店收银台先统一连接到服务商后台,然后服务商后台再通过微信支付接口对接微信后台。

(除这种架构外,也有少部分的商户,从门店收银台直连微信支付后台,这种方式部署和维护的成本相对更高)

从图中也可以看到,微信支付是作为“连接器”,开放微信支付的接口和能力。而服务商与门店收银台之间的接口,则需要商户自定义。门店收银台上的软件开发也需要服务商帮助商户来开发。

其中,门店收银台和服务商后台之间的自定义接口并不难,主要是门店端把微信支付接口中需要的信息都传到服务商后台,同时注意这个接口的安全性(可以参考微信支付的MD5加密方式保证安全性)。

那么在门店收银台这一端,服务商应该如何帮助商户实现微信支付呢?

笔者总结了一下目前市面上常见的解决方案:

干货|微信支付收银端解决方案总结

一般分打通收银软件和不打通收银软件两大类。

打通收银软件

通过直接由POS厂商开发,或者 POS厂商提供开放的接口由其他服务商来开发。一般来说,大型商户都要求打通现有的收银软件,如肯德基,麦当劳等。

不打通收银软件

并不是每个商户/服务商都能撬动POS厂商打通收银软件。而且经过实践证明,在线下不打通收银软件也是可行的,常见的有4种方式:

单独POS机

市场上非常常见的解决方案。

目前,已有不少微信支付服务商已研发了独立的机具,这些机具不仅可以支持刷卡支付,也可以生成二维码进行扫码支付。机具可以直连微信支付后台,也可以通过服务商的云后台连接至微信支付的后台(后者较为常见)。

此类机具还可以支持wifi、4G等联网方式,有些服务商的机具不仅支持扫条码还能扫二维码。还有些机具除支付功能外,还能配备其它功能,如:配备数字键盘输入金额、配备显示器显示支付结果、配备微型打印机功打印小票等。机具的成本通常控制在200-1000之间。

这种方式的优点是,解决方案适用于几乎所有的中小型商户,缺点是制造POS机的软硬件总体成本不低,对于连锁商户来说需要一定的购置成本。

软件的方式hook现有的收银软件

使用这种解决方案的服务商较少,但该种方案对小型商户特别有效。尤其是已经购置收银软件,但无法联系软件提供商或者收银软件厂商不配合接入微信支付的情况。

实现方式:定义收银POS机中一个空闲的键用来表示“微信支付”,服务商的软件hook收银软件后监听这个按键。营业员正常操作现有的收银软件,在确定收费金额以后,点击代表“微信支付”的键,监听到此按键后,软件hook到收银软件中的金额,订单号等信息,然后软件自己的GUI弹出来覆盖收银软件界面,并且光标自动定位到用户条码输入的位置,营业员用扫码器扫描用户的微信支付条码,通过确定键发起支付, 提醒营业员支付成功并且GUI界面自动最小化。

这种接入微信支付的方式,优势是成本低,并且方案成熟后接入速度快。缺点是技术要求高,HOOK的方式不能有BUG,否则可能会出现收银软件系统崩溃。

收银机独立软件

通过服务商独立开发一套收银端的软件(GUI或者web),安装在商户的收银系统上。很多服务商已经采用这种解决方案。

该方案的优势是通用性非常高,没有任何的历史包袱,能应用于各种复杂的线下环境, 缺点是此种方式初期的实现成本略高。

通过二维码支付

具体是指:商户提供一个二维码给用户,用户微信扫一扫完成支付。二维码的生成,有三种不同的实现方式:

A.扫一扫进入H5,输入金额,公众号支付

此种方案类似于大众点评的闪惠,实质是在H5页面由用户自己输入金额,通过公众号里调起支付,输入密码,完成支付。

这里二维码是这个H5页面的地址生成的,用户扫一扫的时候自然进入这个页面。这种方式适特别适用于线下中小商户,不过这种方式有2个问题:一是支付成功的消息如何反馈至商户(可考虑模板消息、企业号消息触达);二是出现退款的情况如何完成(建议线下完成退款)。

B.通过小票上的二维码支付

餐饮行业的围餐,对该方案应用得较为广泛。用户在买单的时候,打印的小票上直接生成一个二维码,用户微信扫一扫后微信支付。

C.通过固定金额的二维码支付

这种方式适合商品是固定金额的商户,比如饮品店。通过二维码定额打印,粘贴在收银台上,用户扫码完成支付。

Nginx 反向代理 log 显示真IP地址

nginx反向代理后,在应用中取得的ip都是反向代理服务器的ip,取得的域名也是反向代理配置的url的域名,解决该问题,需要在nginx反向代理配置中添加一些配置信息,目的将客户端的真实ip和域名传递到应用程序中。

nginx反向代理配置时,一般会添加下面的配置:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

其中第一行关于host的配置,是关于域名传递的配置,余下跟IP相关。

做反向代理时通常会遇到一个问题,就是后端服务器的log全部记录的都是前端代理服务器的IP地址,并不是真实客户端的IP地址,所以需要处理一下! (查看一下后端服务器上的log就清楚了, 例如: /var/log/apache2/access.log)

查看并修改httpd配置文件

[root@web1 ~]# vi /etc/httpd/conf/httpd.conf

默认配置为:

LogFormat “%v:%p %h %l %u %t \”%r\” %>s %O \”%{Referer}i\” \”%{User-Agent}i\”” vhost_combined

LogFormat “%h %l %u %t \”%r\” %>s %O \”%{Referer}i\” \”%{User-Agent}i\”” combined
LogFormat “%h %l %u %t \”%r\” %>s %O” common
LogFormat “%{Referer}i -> %U” referer
LogFormat “%{User-agent}i” agent

修改配置为:(将h%修改为%{X-Real-IP}i

LogFormat “%v:%p %{X-Real-IP}i %l %u %t \”%r\” %>s %O \”%{Referer}i\” \”%{User-Agent}i\”” vhost_combined
LogFormat “%h %l %u %t \”%r\” %>s %O \”%{Referer}i\” \”%{User-Agent}i\”” combined
LogFormat “%h %l %u %t \”%r\” %>s %O” common
LogFormat “%{Referer}i -> %U” referer
LogFormat “%{User-agent}i” agent

最后重启一下后端服务器的 apache 或 web 服务即可

 

apache+nginx静态和动态分离,nginx在apache前,做的PROXY来转发请求到内部的apache上

1,nginx配置:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

2,apache配置:
用mod_rpaf来获取IP的
所以需要安装这个模块
下载:http://stderr.net/apache/rpaf/download/
tar zxvf mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6
/usr/local/www/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

配置apache:
在 httpd.conf中添加
LoadModule rpaf_module libexec/apache2/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 192.168.1.1 #这个是前段的IP,可不是后端的IP哦
RPAFheader X-Forwarded-For

注意,不仅仅要配置nginx,后端获取也需要做配置,例如上面两个例子都做了相应的配置

如何使用16进制编码的RSA公钥进行RSA加密

String modeHex = “D548C6267CC503F1E926776A97F8644CAA67167E8FA5D74FD1F4E0BCB3608BD1583E41B102B5B4617E53B90A0C67EA652F8D96B40CFDDA6BC1501432ADCE15E4B5B916568893C94FF3CAC5ED5942FC604BAD1B12DF7683B25C6702BD8CF1BE2F5A4FFC97C82E42FD91E49A6EFF379F5F022F36E5395D64FC9430EEFCAC55F0A5”;
String exponentHex = “10001”;

KeyFactory factory = KeyFactory.getInstance(“RSA”);

BigInteger n = new BigInteger(modeHex, 16);
BigInteger e = new BigInteger(exponentHex, 16);
RSAPublicKeySpec spec = new RSAPublicKeySpec(n, e);

RSAPublicKey pub = (RSAPublicKey) factory.generatePublic(spec);