精华内容
下载资源
问答
  • 电信、联通双线接入加上内网三线接入   服务器环境如下: IBM服务器,共有4个网卡; 操作系统:ubuntu-10.10-server 接入内网、电信和联通的IP,信息如下 内网:168.168.168.96 电信(TEL)IP: 125.91.219...

    UBUNTU server 10.10版服务器

    电信、联通双线接入加上内网三线接入

     

    服务器环境如下:

    IBM服务器,共有4个网卡;

    操作系统:ubuntu-10.10-server

    接入内网、电信和联通的IP,信息如下

    内网:168.168.168.96

    电信(TEL)IP:  125.91.219.252;  子网掩码: 255.255.255.248; 网关:125.91.219.249

    联通(CNC)IP:  120.81.225.31;  子网掩码: 255.255.255.0; 网关:120.81.225.1

    操作步骤如下

    1、  配置网卡信息

    运行命令sudo vim /etc/network/interfaces把里面的配置修改为如下

    auto lo

    iface loinet loopback

    auto eth0

    ifaceeth0 inet static

            address 168.168.168.96

            netmask 255.255.255.0

    ifaceeth1 inet static

            address 120.81.225.64

            netmask 255.255.255.0

    auto eth1

    ifaceeth2 inet static

            address 125.91.219.252

            netmask 255.255.255.248

            gateway 125.91.219.249

    auto eth2

    保存配置信息并且得启网卡

    sudo /etc/init.d/networking restart

     

    2、  增加电信tel和联通cnc的路由表

    先查看一下路由表的信息

    cat /etc/iproute2/rt_tables

    里面已经显示了部分路由信息,在他的后面加上下面2句,保存退出

    252 tel

    251 cnc

     

    3、  增加路由规则,运行下面6个命令,前3个是设置电信网关,让电信的数据从eth2网卡走,后3个是设置联通网关,让数据从eth1走

    sudo ip route flush table tel

    sudo ip route add default via 125.91.219.249 dev eth2 src 125.91.219.252 table tel

    sudo ip rule add from 125.91.219.252 table tel

    sudo ip route flush table cnc

    sudo ip route add default via 120.81.225.1 dev eth1 src 120.81.225.64 table cnc

    sudo ip rule add from 120.81.225.64 table cnc

     

    4、  运行命令sudo vim/etc/init.d/networking配置脚本文件在exit 0前加入如下内容,其实就是刚才增加的路由规则。

    ip route flush table tel

    ip route add default via 125.91.219.249 dev eth2 src 125.91.219.252 table tel

    ip rule add from 125.91.219.252 table tel

    ip route flush table cnc

    ip route add default via 120.81.225.1 dev eth1 src 120.81.225.64 table cnc

    ip rule add from 120.81.225.64 table cnc

     

    5、  重启网络运行sudo /etc/init.d/networkingrestart

    到此配置结束,叫外面分别通过电信和联通的朋友PING一下网络,看能不能正常。还有一点,本来双线接入就是做WEB服务的,但是电信禁了80端口,要打电话到电信去申请开通80端口才行。

    6、  写入系统启动脚本运行命令sudovim /etc/rc.local,把步骤4的路由规则信息写入到启动脚本中

    参考信息

    http://wanmei13.com/archiver/?tid-140.html


    展开全文
  • 连接内网服务器教程

    千次阅读 2019-09-12 23:06:19
    客户端设置教程 ubuntu ... 2 安装完成后输入sudo zerotier-cli status查看是否与中心服务器通信...3 输入zerotier-cli join 9bee894xxxxd5697加入虚拟内网,如报错,进入第4步,否则进入第5步 4 进入/var/lib/zer...

     

    客户端设置教程

    ubuntu

     

    1 在https://www.zerotier.com/download/中安装zerotier

    2 安装完成后输入sudo zerotier-cli status查看是否与中心服务器通信

    3 输入zerotier-cli join 9bee894xxxxd5697加入虚拟内网,如报错,进入第4步,否则进入第5步

    4 进入/var/lib/zerotier-one/中给authtoken.secret加入权限sudo chmod 755 authtoken.secret

       这一步似乎可以通过输入 sudo zerotier-cli join <Network ID>解决

    5 加入成功后等待我网上批准,批准成功后可直接ssh连接服务器,ssh username@10.244.xxx.160

    6 可输入ifconfig命令查看本机虚拟ip

     

    others

     

    输入 google.com 查看答案

     

    设置服务器教程

    1. https://my.zerotier.com/注册账号,账号注册成功后点击右上角的Networks选项
    2. 选择 Create a Network,创建新的虚拟网络,Network ID即为虚拟网络ID
    3. 推荐选择虚拟网络为 PRIVATE, 这样所有加入虚拟网络的终端都需认证
    4. 按照客户端设置教程从终端请求加入虚拟内网,zerotier-cli join <Network ID>,
    5. 在网页进入该虚拟网络的管理界面,在 Members 选项卡中勾选 Auth 同意加入,可查看每个终端的mac地址、虚拟IP、物理IP
    6. 接下来即可进行各种内网操作
    展开全文
  • android平台接入服务器总结(一)腾讯qq应用宝接入

    腾讯开放平台的接入是非常麻烦的, open.qq.com,腾讯开放平台的文档很多很杂,社交功能的api接口也很多还有。我现在只接了他的登录跟支付。

    一、登录。

    登录相对来讲还是比较简单的,首先前端sdk要正确接入获取access_token  跟 openid ,然后需要一个https  方式的get请求来取得进一步的信息。

    url :https://graph.qq.com/user/get_simple_userinfo?oauth_consumer_key=%s&access_token=%s&openid=%s&clientip=&oauth_version=2.a&scope=all  

    填写好自己应用的所有内容。https协议的java实现

    import java.io.BufferedReader;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.Map;
    import java.util.Map.Entry;
    
    import javax.net.ssl.HostnameVerifier;
    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.SSLSession;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.ByteArrayEntity;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.params.HttpConnectionParams;
    import org.apache.http.params.HttpParams;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    
    public class MyhttpService {
        private  int read_time_out = 10000;
        private Logger logger = LoggerFactory.getLogger(MyhttpService.class);
        
        public MyhttpService() {
            super();
        }
        
        public MyhttpService(int time_out) {
            read_time_out = time_out;
        }
        
        public String doPost(String url, Map<String,String> params){
            StringBuilder postData = new StringBuilder();
            for(Entry<String,String> entry:params.entrySet()){
                if(postData.length()!=0){
                    postData.append("&");
                }
                postData.append(entry.getKey()).append("=").append(entry.getValue());
            }
            return service(false, url, postData.toString(), "POST", null);
        }
        public String doPost(String url, Map<String,String> params,Map<String,String> headers){
            StringBuilder postData = new StringBuilder();
            for(Entry<String,String> entry:params.entrySet()){
                if(postData.length()!=0){
                    postData.append("&");
                }
                postData.append(entry.getKey()).append("=").append(entry.getValue());
            }
            return service(false, url, postData.toString(), "POST", headers);
        }
        public String doPost(String url,String body){
            return service(false, url, body, "POST", null);
        }
        
        public String doPost(String url, String postData, Map<String,String> headers){
            return service(false, url, postData, "POST", headers);
        }
        
        public String doGet(String url, Map<String,String> headers){
            return service(false, url, null, "GET", headers);
        }
        
        public String doGet(String url){
            return service(false, url, null, "GET", null);
        }
        
        public String doHttpsPost(String url, String postData) {
            return service(true, url, postData, "POST",null);
        }
        public String doHttpsPost(String url, Map<String,String> params){
            return  doHttpsPost(url,params,null);
        }
        
        public String doHttpsPost(String url, Map<String,String> params,Map<String,String> headers){
            StringBuilder postData = new StringBuilder();
            for(Entry<String,String> entry:params.entrySet()){
                if(postData.length()!=0){
                    postData.append("&");
                }
                postData.append(entry.getKey()).append("=").append(entry.getValue());
            }
            return service(true, url, postData.toString(), "POST", headers);
        }
        public String doHttpsGet(String url) {
            return service(true, url, null, "GET",null);
        }
        
        private String service(boolean isHttps, String url, String postData, String method, Map<String,String> headers){
            
            HttpURLConnection conn = null;
            try {
                boolean doOutput = postData != null && postData.equals("");
                conn = isHttps ? createHttpsConn(url, method, doOutput) : createHttpConn(url, method, doOutput);
    
                fillProperties(conn, headers);
    
                if(doOutput) writeMsg(conn, postData);
    
                String msg = readMsg(conn);
    
                logger.debug(msg);
    
                return msg;
            } catch (Exception ex) {
                logger.error(ex.getMessage(), ex);
            } finally {
                if (conn != null) {
                    conn.disconnect();
                    conn = null;
                }
            }
            return null;
        }
    
        private HttpURLConnection createHttpConn(String url, String method, boolean doOutput) throws IOException {
            URL dataUrl = new URL(url);
            HttpURLConnection conn = (HttpURLConnection) dataUrl.openConnection();
            conn.setReadTimeout(read_time_out);
            conn.setRequestMethod(method);
            conn.setDoOutput(doOutput);
            conn.setDoInput(true);
            return conn;
        }
        
        public static void main(String[] args) {
    //      System.out.println(DigestUtils.md5DigestAsHex("19a98d31-4652-4b94-b7cd-129e8ddaliji11899CNY68appstoreQY7road-16-WAN-0668ddddSHEN-2535-7ROAD-shenqug-lovedede77".getBytes()));
        }
    
        private String readMsg(HttpURLConnection conn) throws IOException {
            return readMsg(conn, "UTF-8");
        }
    
        private String readMsg(HttpURLConnection conn, String charSet) throws IOException {
            BufferedReader reader = null;
            try{
                reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), charSet));
                StringBuilder sb = new StringBuilder();
    
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }
    
                return sb.toString();
            } finally {
                if(reader != null){
                    reader.close();
                }
            }
        }
    
        private void writeMsg(HttpURLConnection conn, String postData) throws IOException {
            DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
            dos.write(postData.getBytes());
            dos.flush();
            dos.close();
        }
    
        private void fillProperties(HttpURLConnection conn, Map<String,String> params) {
            if(params == null||params.isEmpty()){
                return;
            }
    
            for (Entry<String,String> entry: params.entrySet()) {
                conn.addRequestProperty(entry.getKey(), entry.getValue());
            }
        }
        
        
        public String httpsPost(String url, String postData) {
            HttpURLConnection conn = null;
            try {
                boolean doOutput = (postData != null && postData.equals(""));//!Strings.isNullOrEmpty(postData);
                conn = createHttpsConn(url, "POST", doOutput);
                if (doOutput)
                    writeMsg(conn, postData);
    
                return readMsg(conn);
            } catch (Exception ex) {
                // ingore
                // just print out
                logger.error(ex.getMessage(), ex);
            } finally {
                if (conn != null) {
                    conn.disconnect();
                    conn = null;
                }
            }
            return null;
        }
        
    
        private HttpURLConnection createHttpsConn(String url, String method, boolean doOutput) throws Exception {
            HostnameVerifier hv = new HostnameVerifier() {
                public boolean verify(String urlHostName, SSLSession session) {
                    return true;
                }
            };
    
            HttpsURLConnection.setDefaultHostnameVerifier(hv);
            trustAllHttpsCertificates();
    
            URL dataUrl = new URL(url);
            
            HttpURLConnection conn = (HttpURLConnection) dataUrl.openConnection();
            conn.setReadTimeout(read_time_out);
            conn.setRequestMethod(method);
            conn.setDoOutput(doOutput);
            conn.setDoInput(true);
            return conn;
        }
        
        private static void trustAllHttpsCertificates() throws Exception {
    
            //  Create a trust manager that does not validate certificate chains:
    
            javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
            
            javax.net.ssl.TrustManager tm = new miTM();
    
            trustAllCerts[0] = tm;
    
            javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL");
    
            sc.init(null, trustAllCerts, null);
    
            javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(
                    sc.getSocketFactory());
    
        }
        
        public static class miTM implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }
    
            public boolean isServerTrusted(
                    java.security.cert.X509Certificate[] certs) {
                return true;
            }
    
            public boolean isClientTrusted(
                    java.security.cert.X509Certificate[] certs) {
                return true;
            }
    
            public void checkServerTrusted(
                    java.security.cert.X509Certificate[] certs, String authType) throws
                    java.security.cert.CertificateException {
                return;
            }
    
            public void checkClientTrusted(
                    java.security.cert.X509Certificate[] certs, String authType) throws
                    java.security.cert.CertificateException {
                return;
            }
        }
        /** 
         * 执行一个HTTP POST请求,返回请求响应的内容
         * @param url        请求的URL地址 
         * @param params 请求的查询参数,可以为null 
         * @return 返回请求响应的内容 
         */ 
        public static String doPostforUC(String url, String body) { 
            StringBuffer stringBuffer = new StringBuffer();
            HttpEntity entity = null;
            BufferedReader in = null;
            HttpResponse response = null;
            try {
                DefaultHttpClient httpclient = new DefaultHttpClient();
                HttpParams params = httpclient.getParams();
                HttpConnectionParams.setConnectionTimeout(params, 20000);
                HttpConnectionParams.setSoTimeout(params, 20000);
                HttpPost httppost = new HttpPost(url);
                httppost.setHeader("Content-Type", "application/x-www-form-urlencoded");
    
                httppost.setEntity(new ByteArrayEntity(body.getBytes("UTF-8")));
                response = httpclient.execute(httppost);
                
                entity = response.getEntity();
                in = new BufferedReader(new InputStreamReader(entity.getContent(),"UTF-8"));
                String ln;
                while ((ln = in.readLine()) != null) {
                    stringBuffer.append(ln);
                    stringBuffer.append("\r\n");
                }
                httpclient.getConnectionManager().shutdown();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e1) {
                e1.printStackTrace();
            } catch (IllegalStateException e2) {
                e2.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (null != in) {
                    try {
                        in.close();
                        in = null;
                    } catch (IOException e3) {
                        e3.printStackTrace();
                    }
                }
            }
            return stringBuffer.toString();
        } 
    
    }
    
    内容的返回是json格式的,可以从里面找自己需要的内容来解析

    JSONParser jsonParser = new JSONParser(JSONParser.DEFAULT_PERMISSIVE_MODE);
                        JSONObject obj;
                        obj = (JSONObject) jsonParser.parse(doHttpsGet);
                        String code = String.valueOf(obj.get("ret"));
                        if(code.equals("0")){
                            String nickName = String.valueOf(obj.get("nickname"));
    后面就是自己服务器的逻辑了。登录相对来讲还是很简单的。

    二、支付
    1、腾讯的支付接口不知道是新开发的,还是涉及太多,总之非常乱,他们的开放平台的wiki上面有,四个服务,应用接入,移动接入,网站接入,腾讯云接入。因为我们是移动游戏所以,应该按照移动接入来接,但是实际上还要涉及应用接入这边的文档。只看一边的文档会发现少很多东西。按照文档接入出现问题。正题。

    我手中的文档是 移动接入的sdk下载里面的

    ,腾讯的支付有两种:第一种是由腾讯来管理我们的支付,举例就是玩家充值的元宝在腾讯服务器上面,这个蛋疼的地方是,以后你所有的元宝操作都要跟腾讯交互,增加、扣除、赠送等等都要写协议去腾讯云处理。所以我们用了另外一种模式,道具购买模式。道具购买模式是直接花q点或者q币购买我们的道具,这个道具就是元宝。

    2、这里有一个问题是,sdk里面自带的文档跟wiki上面的不一致,调用的接口也不是一个

    这个对我们的影响在于后面的发货接口。发货接口的文档又再wiki上面,所以后面我们回到wiki的时候发现两份文档对不上。sdk文档包括腾讯托管跟我们自己管理元宝两种,第一种因为接口多,所以大部分是将第一种方式的。

    3、道具购买服务器需要实现两个接口。购买道具下订单接口。购买结束回调接口。

    下单接口需要客户端在登录时候取得  paytoken  openkey  pf  pfkey  然后按照文档以  http  方式连接开放api就可以了。

    //qq直接购买道具下单界面
    	public String qq_buy_items(String appid,String sessionId ,String openid,String pay_token,String openkey ,String amount,String pf,String pfkey){
            String appkey = PlatformUtil.QQ_APPKEY;
            String apiaddress = "119.147.19.43";//qq测试地址
    //        String apiaddress = "openapi.tencentyun.com";//qq正式
            //pf = "qq_m_qq-10000144-android-10000144-1111";
            //pfkey = "pfkey";
            OpenApiV3 openApiV3 = new OpenApiV3(appid, appkey, apiaddress);
            String zoneid="1";
            
            Map<String,String> params = new HashMap<String, String>();
            params.put("openid", openid);
            params.put("openkey", openkey);
            params.put("pf", pf);
            params.put("pfkey",pfkey);
            params.put("ts", String.valueOf(System.currentTimeMillis()/1000));
            params.put("pay_token", pay_token);
            params.put("zoneid", zoneid);
            params.put("appmode", "1");
            params.put("appid", appid);
            int iamount = SCUtils.calcScCount(amount+".0");
            String payitem = String.format("100*1*%s",String.valueOf(iamount));
            String goodsmeta = "元宝*元宝";
            String goodsurl = "http://dragon.dl.hoolaigames.com/other/CH.png";
            String app_metadata = String.format("%s-%s-",sessionId,String.valueOf(amount));
            params.put("payitem", payitem);
            params.put("goodsmeta", goodsmeta);
            params.put("goodsurl", goodsurl);
            params.put("app_metadata",app_metadata);    //这个在最终透传时候会增加腾讯的内容,*qdqd*qq 告诉我们是用什么方式支付的
    //        params.put("qq_m_qq",String.format("%s,%s,%s", appid,openid,openkey) );
            try {
                Map<String,String> cookies = new HashMap<String, String>();
                cookies.put("session_id", SnsSigCheck.encodeUrl("openid"));
                cookies.put("session_type", SnsSigCheck.encodeUrl("kp_actoken"));
                cookies.put("org_loc ",SnsSigCheck.encodeUrl("/mpay/buy_goods_m"));
                String api = openApiV3.api("/mpay/buy_goods_m", params,null ,"http");
                return api;
            } catch (OpensnsException e) {
                log.error("openApiV3.api invoke failed",e);
                return "error";
            }
        }
    其中的  OpenApiV3 其实可以从开放平台下载,是   http://wiki.open.qq.com/wiki/SDK%E4%B8%8B%E8%BD%BD  里面其实是一些验证以及http的访问。实际接入时候可以下载一个最新的看看。返回值也是一个json

    JSONParser jsonParser = new JSONParser(JSONParser.DEFAULT_PERMISSIVE_MODE);
                        JSONObject obj;
                        obj = (JSONObject) jsonParser.parse(payurl);
                        int ret = (Integer) obj.get("ret");
                        String msg = (String) obj.get("msg");
                        String token_id = (String) obj.get("token");
                        String url_params = (String) obj.get("url_params");
    关于返回值里面参数,文档跟实际的返回有些出入,不一致,token 文档中写的是token_id  但实际返回的是token,这个可以实际debug看下再接收参数。得到的这些值需要发送给前端的sdk,前端的sdk会用这个返回的url 处理剩下的逻辑。

    4、支付回调。客户端拿到刚才的url 会回传给腾讯,然后腾讯会调用我们在后台配置的回调接口,来通知支付结果,同时我们也要处理道具发放逻辑。这里有一个非常困难的问题 https协议的证书问题。 腾讯的证书最变态的一点是绑定ip地址,当然也是为了安全考虑。腾讯的后台我没有登录,但是应该是配置回调的ip地址,填写回调url  然后腾讯会生成一个绑定ip地址的证书,你需要安装这个证书在那台服务器上面,

    发货URL用来给腾讯计费后台回调。用户付费成功后,腾讯计费后台将回调该URL给用户发货。在9001端口后可以是一个cgi或者php的路径。

    hosting应用on CVM(即应用部署在腾讯CVM服务器上):
    -发货URL只需HTTP协议即可,不需要使用SSL安全协议。
    -必须使用9001端口(内网端口,需开发者主动启用,用apache iis或nginx做一个web监听,端口改成9001)。

    hosting应用on CEE_V2(即应用部署在腾讯CEE_V2服务器上):
    -发货URL只需HTTP协议即可,不需要使用SSL安全协议。
    -必须使用9001端口(内网端口,需开发者主动启用,用apache iis或nginx做一个web监听,端口改成9001)。
    -路径必须以ceecloudpay开头,即支付相关代码必须都放到应用根目录下的“ceecloudpay”目录下。
    -对于CEE其发货URL的IP只能填写为10.142.11.27或者10.142.52.17(详见:CEE_V2访问云支付)。 

    non-hosting应用(即应用部署在开发者自己的服务器上):
    -发货URL必须使用HTTPS协议。
    -必须使用443端口(外网端口)。
    -必须填写发货服务器所在运营商(电信/联通)。

    这是腾讯官方文档对于这个的解释,总之很麻烦的一个东西,中间遇到什么问题,建议找他们的企业支持。

    5、证书的安装。

    证书安装很坑爹的一个没有官方文档,官方有一个window浏览器的导入文档,没有linux的。这太无语了。

    证书的安装可以安装在apache 或者 nginx 下面,我没有直接安装在tomcat下面,应该也是可以的吧,用apache或者nginx 可以做转发,转发到本地debug什么的。所以,我们用的是nginx做转发。首先腾讯后台下载一个这样的证书包。

    这个里面带钥匙的那个需要密码,密码在readme里面,但是其实linux下面并没有用到,这个我估计是原始的密钥文件,可以和那个key生成 crt 文件,但是这里已经是生成好了的 crt 文件所以还是直接用比较好,先给第一个最长的那个起个别的名字。然后上传到 nginx 服务器的 conf 目录下面 ,nginx 在安装服务的时候应该是默认为支持https的 ssl 的,所以一般是不需要重新编译的,如果需要重新编译,可以去网上找找相关资料。如果你的  nginx  支持,那么就剩下一步,修改配置文件。 同样是conf目录下面的  nginx.conf   

    server {
            listen       443;
            server_name  xxxxxxx;
            ssl                       on;
            ssl_certificate           oem.crt;
            ssl_certificate_key       oem.key;
            ssl_verify_client         off;
            ssl_session_timeout       5m;
            ssl_protocols             SSLv2 SSLv3 TLSv1;
            ssl_ciphers               ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
            ssl_prefer_server_ciphers on;
            ssl_client_certificate      ca.crt;
            ssl_verify_depth            1;
    
            location ~  ^/xxxxxr/* {
                    proxy_pass http://xxxxxx3;
                    index  index.jsp index.html index.htm;
                    proxy_set_header        Host $host;
                    proxy_set_header  X-Real-IP  $remote_addr;
                    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
            }
        }
    
    里面的
    ssl_client_certificate
    ssl_certificate
    对应证书里面的名字,修改完成后记得reload    ./nginx -s reload  一下应该就生效了,我是做了转发本地处理的,当然也可以转发到任意服务器或者本机。如果下订单成功但是收不到回调,多半是这个证书的问题,可以看 nginx的log日志看看有没有访问到。如果没有80%都是证书的问题,询问下腾讯的支持让他们帮你查下日志吧,不过等他们反馈,估计你已经找到原因了。

    6、支付回调的验证,当你终于能收到回调了,恭喜你你就要成功了。

    对于支付回调的处理,其实很简单,但是腾讯的就很蛋疼。这就是上面说的蛋疼的问题,没有文档。sdk里面的文档说去看 wiki ,wiki里面的文档貌似不是这一版的,而且sdk文档里面的连接还是去 wiki 的主页,哎。  这里忍不住吐槽太多太乱,大家看上去都差不多,我哪知道是我需要的接口。最终我看到这个貌似像 :

    http://wiki.open.qq.com/wiki/%E5%9B%9E%E8%B0%83%E5%8F%91%E8%B4%A7URL%E7%9A%84%E5%8D%8F%E8%AE%AE%E8%AF%B4%E6%98%8E_V3

    这个文档上面的参数回调,大部分都是正确的。注意是大部分,因为收到的所有参数都要参与 HmacSHA1 签名,所以一个参数错误就悲剧了,你都不知道去哪里找,贴一下我最终的回调处理。

    //qq支付回调接口,根据http://wiki.open.qq.com/wiki/%E5%9B%9E%E8%B0%83%E5%8F%91%E8%B4%A7URL%E7%9A%84%E5%8D%8F%E8%AE%AE%E8%AF%B4%E6%98%8E_V3   编写
        protected void processRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException  {
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            Map<String, Object> obj = new HashMap<String, Object>();
            try {
                String openid = request.getParameter("openid");     //根据APPID以及QQ号码生成,即不同的appid下,同一个QQ号生成的OpenID是不一样的。
                String appid = request.getParameter("appid");       //应用的唯一ID。可以通过appid查找APP基本信息。
                String ts = request.getParameter("ts");             //linux时间戳。 注意开发者的机器时间与腾讯计费开放平台的时间相差不能超过15分钟。
                String payitem = request.getParameter("payitem");   //接收标准格式为ID*price*num   G001*10*1
                String token = request.getParameter("token");       //应用调用v3/pay/buy_goods接口成功返回的交易token
                String billno = request.getParameter("billno");     //支付流水号(64个字符长度。该字段和openid合起来是唯一的)。
                String version = request.getParameter("version");   //协议版本 号,由于基于V3版OpenAPI,这里一定返回“v3”。
                String zoneid = request.getParameter("zoneid");     //在支付营销分区配置说明页面,配置的分区ID即为这里的“zoneid”。  如果应用不分区,则为0。
                String providetype = request.getParameter("providetype");//发货类型   0表示道具购买,1表示营销活动中的道具赠送,2表示交叉营销任务集市中的奖励发放。
                //Q点/Q币消耗金额或财付通游戏子账户的扣款金额。可以为空 若传递空值或不传本参数则表示未使用Q点/Q币/财付通游戏子账户。注意,这里以0.1Q点为单位。即如果总金额为18Q点,则这里显示的数字是180。
                String amt = request.getParameter("amt");           
                String payamt_coins = request.getParameter("payamt_coins");//扣取的游戏币总数,单位为Q点。
                String pubacct_payamt_coins = request.getParameter("pubacct_payamt_coins");//扣取的抵用券总金额,单位为Q点。
                String appmeta = request.getParameter("appmeta");
                String clientver = request.getParameter("clientver");
                String sig = request.getParameter("sig");
                
                String url = "/xxx/xxxx";
                
                Map<String, String> params = createCallbackParamsMap(openid, appid, ts, payitem, token, billno, version, zoneid,
                        providetype, amt, payamt_coins, pubacct_payamt_coins, appmeta,clientver);
                if(SnsSigCheck.verifySig(request.getMethod(), url,params, PlatformUtil.QQ_APPKEY+"&", sig)){
                    
                    if(ok){
                        
                    }else{
                        
                        obj.put("ret", 0);
                        obj.put("msg", "ok");
                    }
                }else{
                    log.info("qqPayCallback SnsSigCheck fail.");
                    obj.put("ret", -5);
                    obj.put("msg", "签名错误");
                }
                    String resp = JSONObject.toJSONString(obj);
                    out.println(resp);
            } catch (SQLException | DbException | ProtocolException | NumberFormatException | OpensnsException e) {
                e.printStackTrace();
            } finally {
                out.close();
            }
    中间标红的地方都是有问题的地方,都是坑。首先 
    pubacct_payamt_coins
    是有可能传空的,因为你没有用抵用券对吧,但是记住这个也需要加入签名。   clientver  神坑。我最终也没再文档或者哪里找到这个参数为什么给我传过来,但是你就是传过来了,而且你还必须接收,必须加入签名中去,也许我水平太菜,反正我是没找到这个参数在那个文档上面写了。 鄙视

    createCallbackParamsMap  字面意思就是把参数弄到 map里面 

    SnsSigCheck.verifySig  这也是上面下载的那个工具项目中自带的功能,其实就是一个   HmacSHA1  的 utf 格式的签名。可以下载,有兴趣的也可以自己写写。

      (三)总结

    腾讯的支付接口应该做的不难,困难在于没有一个明确的文档。




    展开全文
  • Linux:通过外网连接内网服务器方法

    千次阅读 2019-08-20 19:37:14
    外网连接服务器 Release1.0 step 01 ssh 连接公网服务器 ip 47.95.233.183: 22 default port 22 username root ...step 02 反向连接内网 ssh wvdon@localhost -p1234 username :wvdon port 1234 Are you...

    Linux:外网连接服务器

    Release1.0

    step 01 ssh 连接公网服务器

    ip 47.95.233.183: 22 default port 22

    username root

    password *********

    step 02 反向连接内网

    ssh wvdon@localhost -p1234     
    

    username :wvdon port 1234

    Are you sure you want to continue connecting (yes/no)? 
    yes
    

    password

    *******
    

    Release2.0

    解决经常中断问题

    Step 01 (同上)

    Step 02

    ssh wvdon@localhost -p 22001
    

    password

    ******
    

    增加了监听端口,来达到连接稳定

    方法


    内网 a

    外网 b

    a内网主机添加秘钥实现免登陆

    ssh-keygen -t rsa -C "mail@wvdon.com"
    

    a添加到公网主机

    ssh-copy-id b@111.123.123.123
    

    b公网主机添加监听

    sudo vi /etc/ssh/sshd_config
    

    b添加

    GatewayPorts yes
    

    b重启ssdh

    sudo service sshd restart
    

    a安装autossh

    sudo apt-get install autossh
    

    a开启autossh

    autossh -M 22002 -NfR 0.0.0.0:22001:localhost:22  root@47.95.233.183
    

    同时到阿里云服务器安全规则配置里面添加22001,22002端口

    b连接
    ssh wvdon@47.95.233.183 -p 22001
    

    a设置开机自启

    sudo vi /etc/rc.local
    

    a添加代码

    autossh -M 22002 -NfR 0.0.0.0:22001:localhost:22  root@47.95.233.183
    启
    
    

    sudo vi /etc/rc.local

    
    a添加代码
    
    

    autossh -M 22002 -NfR 0.0.0.0:22001:localhost:22 root@47.95.233.183

    展开全文
  • IT新手,刚入职个酒店,现在酒店新增了台手持机,手持机在服务器上做了SQL数据库,定义好了服务器地址10.42.X.X,然后开了8017的端口,手持机需要接入内网才可以使用。 我在内网节点上,装了台小米路由器配置静态IP...
  • SSH 反向隧道 内网穿透,AutoSSH自动重连 1. SSH反向隧道 通常家用的宽带没有公网IP,运营商现在都分配的是内网IP。这样,公网上的机器就无法直接访问到内网的机器。 SSH具有建立反向隧道的能力,进行内网穿透,前提...
  • 企业内部网的前身是电子数据交换系统。纯EDI系统目前仍然在使用,但许多都经过改装,以实现对互联网的兼容。企业外联网是不同于企业内部网与互联网的另一种网络。企业外联网是从事合作业务的贸易伙伴之间,包括供应...
  • 内网穿透即内网映射,作用是将局域网服务器、或网站、或应用发布到公网访问 有什么作用: 可以让你写的web项目给你的远方好朋友可以访问 Socket套字的网络编程可以远程连接 让你写代码不再无聊丧气 这里是使用...
  • 内网搭建web服务器

    千次阅读 2008-02-29 15:55:00
    但TL-R410多功能宽带路由器就自带了域名服务器的客户端和端口映射功能,两项功能的强强组合,让内网用户建立个人服务器成为了一件极其简单的事(笔者主机为ADSL宽带接入)。 1.拨号连接 在TL-R410多功能宽带路由器...
  • 为方便本地调试模式下能够正常与发布在服务器上的docker容器通讯
  • 外网远程桌面连接内网服务器教程(超详细)

    万次阅读 多人点赞 2017-09-15 16:15:34
    这就是远程桌面的最大功能,通过该功能网络管理远程桌面连接员可以在家中安全的控制单位的服务器,而且由于该功能是系统内置的所以比其他第三方远程控制工具使用更方便更灵活。  注:家庭版的系统没有这个功能,...
  • 按其功能可分为升级服务器接入控制服务器(探头)、数据库三个模块。制定安全策略。包括外部人员的访问区域,企业对不同用户的安全策略,如补丁策略、防病毒策略、口令策略、软件清单策略等进行实时监控。
  • 本文遵从自由软件基金会发布的GNU自由文档许可证(GNU Free Document License), 任何组织和个人都有在此条款下的复制,转载...首先要求电脑有两块网卡,一个连接到外网,一个连接到switch,而switch与内网其他电脑相连。
  • 本地多台服务器部署远程连接及配置防火墙 本文讨论如何利用端口映射和...而高校出于网络安全、IPv4地址有限等原因,对于只对校内提供服务的项目只提供校内私网接入内网IP地址,不提供公网。 以往公司要远程部...
  • 低端飞塔防火墙内网接口默认为交换模式,所有接口共用一个IP,如果需要每个接口都独立设置IP,就需要改变接口的模式。
  • 微信公众号开发之服务器验证接入

    千次阅读 2019-06-26 16:14:14
    微信验证接入过程就是微信给你的服务器发送一个get请求,请求中携带signature、timestamp、nonce和echostr四个参数,其中signature为签名,timestamp为时间戳,nonce为一个随机字符串echostr为返回码,在自己的...
  • LINUX 配置DNAT发布内网服务器

    千次阅读 2019-05-31 08:06:15
    问题 本案例要求熟悉DNAT策略的典型应用场景,完成以下任务: 1)通过DNAT策略发布内网的Web服务器 ...其中,虚拟机svr5作为局域网络的测试机,接入NAT网络(virbr0);虚拟机pc120作为Internet的测试机...
  • GB28181接入服务器是EasyDSS云平台提供的接入GB28181设备/平台的信令交互服务器,GB28181将 SIP定位为联网系统的主要信令基础协议,并利用 SIP协议的有关扩展,实现了对非会话业务的兼顾,例如,对报警业务、历史视...
  • 但是家里是在一个内网中,公司的服务器也是在一个内网中,它们各自有各自独立的局域网IP。两者不可能直接通信的,但是可以通过双方都可以访问的第三方服务器来达成链接。这种方法又叫做内网穿透,目前我并没有第三方...
  • 最近工作中中遇到了这样的情况...利用外网服务器以及反向SSH搭一条通道,就可以利用外网的服务器登录内网服务器。 两台服务器配置 名称 IP 内网服务器 192.168.1.107 外网服务器 100....
  • 利用natapp实现手机访问内网 linux 服务器 背景 硬件设备: ubuntu服务器1台; 安卓4.0以上版本手机1部; 环境描述: LINUX服务器部署在内网环境,局域网内可以访问LINUX,也可以通过公共服务器代理上外网。 ...
  • 在介绍GB28181接入服务器的方案前,咱们先大概给大家介绍一下为什么我们选择了用nodejs开发国标GB28181的服务,我大概给很多人介绍过这个方案,大部分都为之虎躯一震,nodejs在传统行业的人事看来,就是主要做网站、...
  • 内网架设FTP服务器(serv-u)

    千次阅读 2009-08-09 10:13:00
    1. 内网FTP服务器的概念 设想下面的这种环境:几台计算机组成一个局域网,该局域网中拥有一台DHCP服务器负责为局域网中每台计算机分配IP地址。其中有一台计算机(或网络设备)作为网关(可以与DHCP服务器为同一台...
  • 目前许多企业对外部终端并没有部署有效的安全接入措施,而访问到企业内网的人身份混杂目的不明,对企业内部的信息安全造成严重的威胁。如何防止外部终端随意访问内网?国际领先的内网安全管理专家IP-guard认为,准入...
  • 但是,如果有本地的域名解析服务器,则第一台设备访问后,会将域名解析结果放DNS服务器的缓存中,此时下来其它设备访问同一网站时,速度更快且节省带宽。 内网内的域名解析服务器可以随意命名,比如我想用baidu....
  • 设置端口映射或DMZ主机---将内网web服务器映射公网 原链接 https://blog.csdn.net/qq_31739317/article/details/75008375   总的来说,原理很简单,只要路由器的WAN IP是公网的IP,就可以将自己内网的一些...
  • 你想跟微信合作,调用微信的接口,你和他...所以第一步就是想办法连起来,即接入,这是开发的第一步骤,把你和微信连起来,接入指南以下是微信开放平台(开发者用的)资源中心的开发文档,参考微信的的接入指南微信...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,568
精华内容 13,427
关键字:

内网接入服务器