实际开发中,我们一定遇到过这样的问题:

  1. 后端用的时间单位是Date,前端用的秒
  2. 又比如,后端用的金额单位是分,前端用的是元

总之,单位不统一,而且各有各自的理由,统一不了,那就转换吧。
每次返回给前端时再转换一遍,返回给前端的json数据,在后端里定义的往往是一个对象,如何做到优雅的转换呢?只需两步

1. 写一个负责转换的类,里面写好规则

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.util.Date;

/**
 * @version 1.0 2016/12/7
 * @since 1.0
 */
public class Date2LongSerialize extends JsonSerializer<Date> {

    @Override
    public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
        jsonGenerator.writeNumber(date.getTime() / 1000);
    }
}

2. 在返回的参数里加上注解
@Data
@JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class)
public class PledgeDetailItemVO implements Serializable {

    private static final long serialVersionUID = 2308418084162500432L;

    private String remark;

    @JsonSerialize(using = Date2LongSerialize.class)
    private Date addTime;
}

这样就能做到自动转换了!

公司service层由java实现,和应用层之间采用HessianRPC协议交互。

关于HessianPHP的使用,这里不再说明。

应用层php调用java中发现以下问题。

使用的是HessianPHP_v2.0.3

当传递的参数是一个对象时,需要做一下转换

传递对象

$array = [
    'name' => 'Lucy',
    'age'  => 18
];

$object = arrayToObject($array);

$service->getUser($object);

//转换函数
function arrayToObject($arr) {
    if ($arr && is_array($arr)) {

        $obj = &new StdClass();

        foreach($arr as $k=>$v) {
            if (is_array($v)) {
                $obj->$k = arrayToObj($v);
            } else {
                $obj->$k = $v;
            }
        }

        return $obj;
    }

    return false;
}


去网上查询说,要使用类似

$object->__type = 'com.com.sample.hessian.Person';

这样的写法,我测试了,是不需要写的。。。

传递枚举

其实,枚举也是对象,只不过,属性名是name,示例如下:

php

$status = arrayToObject(['name' => 'CLOSED']);

$service->getRoomList($status);

java

public enum SlideStatusEnum {

    /** 关闭. */
    CLOSED(0),

    /** 启用. */
    OPEN(1);

    private final int code;

    public Integer getCode() {
        return code;
    }

}

首先说一下服务商版,可以到这里看看介绍 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>

最近需要独立安装mysql,看到网上的教程乱七八糟,所以自己写一个

####1. 安装brew,自行百度

####2. 安装mysql

cd ~
brew install mysql

####3. 重启电脑(有待确认,貌似不重启也可以)

####4. 启动mysql

cd /usr/local/Cellar/mysql/5.6.26/bin
./mysql.server start

`注`5.6.26的我的mysql版本号,可能和你安装的有所区别

####5. 进入mysql控制台

cd /usr/local/Cellar/mysql/5.6.26/bin
./mysql -u root -p

`注`密码为空,直接敲回车

####6. 查询所有的数据库

show databases;

结果如下所示
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+

使用daemon方式来启动tomcat是官方最推荐的方式,不行你去查!下面记录了我安装的过程。

我服务器上已经安装好了java环境
####1. 下载解压tomcat

wget http://archive.apache.org/dist/tomcat/tomcat-8/v8.0.26/bin/apache-tomcat-8.0.26.tar.gz
tar zxvf apache-tomcat-8.0.26.tar.gz
mv apache-tomcat-8.0.26 /usr/local/tomcat

####2. 安装Daemon 自启动

cd /usr/local/tomcat/bin/
tar xvfz commons-daemon-native.tar.gz
cd commons-daemon-1.0.15-native-src/unix/
./configure
make
cp jsvc ../..

3. 新增tomcat用户并赋权限

useradd -r tomcat
chown -R tomcat: /usr/local/tomcat

4. 编写系统服务(关键)

vim /usr/lib/systemd/system/tomcatd.service

写入下面内容

Description=Apache Tomcat Web Application Container
After=network.target syslog.target
[Service]
Type=forking
PIDFile=/var/run/tomcatd.pid
Environment=CATALINA_PID=/var/run/tomcatd.pid
Environment=JAVA_HOME=/usr/local/jdk1.8
Environment=CATALINA_HOME=/usr/local/tomcat
ExecStart=/usr/local/tomcat/bin/daemon.sh start
ExecStop=/usr/local/tomcat/bin/daemon.sh stop
[Install]
WantedBy=multi-user.target

JAVA_HOME按照自己情况来定,可通过echo $JAVA_HOME来查看

####5. 将tomcat加入系统自启动

systemctl enable tomcatd.service

####6. 测试是否能启动

systemctl start tomcatd.service
ps -aux| grep tomcat

####注意的问题

  • 重启服务,请使用
systemctl stop tomcatd.service
systemctl start tomcatd.service
  • 发现启动后不能访问,极有可能是防火墙原因,开启8080端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload

当然,如果你懒得可以,也可以使用我编写的安装脚本来安装

wget http://7d9pow.com1.z0.glb.clouddn.com/install_tomcat.sh
chmod +x install_tomcat.sh
./install_tomcat.sh

20151104更新

发现开机启动有问题,于是新写了个脚本

vim  /etc/init.d/tomcat
#!/bin/sh
CATALINA_HOME=/usr/local/tomcat
export JAVA_HOME=/usr/local/jdk1.8.0_60
export JAVA_HOME CATALINA_HOME
exec $CATALINA_HOME/bin/daemon.sh $*

设置开机启动

chkconfig --add tomcat
chkconfig tomcat on

如果以后想重启的话,使用

service tomcat stop
service tomcat start