精华内容
下载资源
问答
  • 几乎每个web应用都会用到表单,那么验证器就是必不可少的东西,这篇文章主要介绍了angular 实现同步验证器跨字段验证的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要介绍了ajax同步验证单号是否存在的方法,涉及基于ajax的数据交互相关操作技巧,需要的朋友可以参考下
  • 主要介绍了mongo复制集同步验证的实例详解的相关资料,这里提供实现的方法及示例代码,帮助大家学习理解,需要的朋友可以参考下
  • Spring Boot 实现苹果支付同步验证代码苹果返回相应状态码 代码 package com.yuezhi.controller.pay; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.InputStreamReader; ...

    Spring Boot 实现苹果支付同步验证

    代码

    package com.yuezhi.controller.pay;
    
    import java.io.BufferedOutputStream;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.URL;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    import java.util.Date;
    import java.util.List;
    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.X509TrustManager;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.bind.annotation.RequestMapping;
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    
    /**
     * @ProjectName yuezhi
     * @ClassName ApplePay
     * @Description 苹果支付
     * @Author Wednesday
     * @Date 2019/9/19 15:17
     * @Version 1.0
     **/
    @RestController
    @RequestMapping("/pay")
    public class ApplePayController {
        // 购买凭证验证地址
        private static final String certificateUrl = "https://buy.itunes.apple.com/verifyReceipt";
        // 测试的购买凭证验证地址
        private static final String certificateUrlTest = "https://sandbox.itunes.apple.com/verifyReceipt";
    
        private static Logger logger = LoggerFactory
                .getLogger(ApplePayController.class);
    
        @Value("${chooseEnv}")
        private Boolean chooseEnv;
    
        @Autowired
        private PayTypeService payTypeService;
    
        @Autowired
        private UserOrderService userOrderService;
    
    
        @Autowired
        private UserPropertyService userPropertyService;
    
        private static List<PayType> payTypes = null;
    
        /**
         * 重写X509TrustManager
         */
        private static TrustManager myX509TrustManager = new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
    
            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }
    
            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }
        };
    
        /**
         * 接收iOS端发过来的购买凭证
         *
         * @param receipt 苹果的receipt
         */
        @RequestMapping("/applePayIap")
        public JsonView sendHttpsCoon(String receipt, String test) {
            JsonView jsonView = new JsonView();
            System.out.println(receipt);
            System.out.println(test);
    
            String url = chooseEnv == true ? certificateUrl : certificateUrlTest;
            try {
    
                UserRegis userRegis = UserThreadLocal.get();
                if (userRegis == null) {
                    jsonView.setCode(JsonView.TOKEN_TIME_OUT_OR_NULL);
                    jsonView.setData(0);
                    jsonView.setMessage("请登录!");
                    return jsonView;
                }
    
                // 设置SSLContext
                SSLContext ssl = SSLContext.getInstance("SSL");
                ssl.init(null, new TrustManager[]{myX509TrustManager}, null);
    
                // 打开连接
                HttpsURLConnection conn = (HttpsURLConnection) new URL(url).openConnection();
                // 设置套接工厂
                conn.setSSLSocketFactory(ssl.getSocketFactory());
                // 加入数据
                conn.setRequestMethod("POST");
                conn.setDoOutput(true);
                conn.setRequestProperty("Content-type", "application/json");
                conn.setRequestProperty("Proxy-Connection", "Keep-Alive");
                JSONObject obj = new JSONObject();
                obj.put("receipt-data", receipt);
                // 获取输出流
                BufferedOutputStream buffOutStr = new BufferedOutputStream(conn.getOutputStream());
                buffOutStr.write(obj.toString().getBytes());
                buffOutStr.flush();
                buffOutStr.close();
                // 获取输入流
                BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    
                String line = null;
                StringBuffer sb = new StringBuffer();
                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }
                String verifyResult = sb.toString();
                conn.getInputStream().close();
                logger.error("苹果返回的验证信息-->  " + verifyResult);
    
                //=============================↑↑↑验证逻辑代码↑↑↑===============================
                //
                //------------------------------------------------------------------------------------
                if (verifyResult == null) {
                    jsonView.setMessage("苹果验证失败,返回数据为空");
                    jsonView.setData(1);
                    jsonView.setCode(JsonView.BALANCE_NULL2);
                    return jsonView;
                } else {
    			 	//以上接收碰过返回的交易信息。之后逻辑根据自己的业务需求进行
                }
            return jsonView;
        }
    }
    
    

    苹果返回相应状态码

    	/**
    	* 苹果支付检验返回状态码 描述
    	* 21000 App Store无法读取你提供的JSON数据
    	* 21002 收据数据不符合格式
    	* 21003 收据无法被验证
    	* 21004 你提供的共享密钥和账户的共享密钥不一致
    	* 21005 收据服务器当前不可用
    	* 21006 收据是有效的,但订阅服务已经过期。当收到这个信息时,解码后的收据信息也包含在返回内容中
    	* 21007 收据信息是测试用(sandbox),但却被发送到产品环境中验证
    	* 21008 收据信息是产品环境中使用,但却被发送到测试环境中验证
    	*/
    
    
    展开全文
  • <div><p>用的是tradepagepay,在付款和异步验证到notify时都正常,但是到同步验证时,报crypto/rsa: verification error的错误,也就是这一步<code>ok, err := client.VerifySign(req.Form)时报错了</p><p>该提问...
  • ## SyncValidate ``` /** * 同步验证器 */ export class SyncValidate { /** * { [key]: Validate[] } * @param {Object} options */ constructor(options) { this.options = options; } /** * check({key: value}) ...

    ## SyncValidate ``` /** * 同步验证器 */ export class SyncValidate { /** * { [key]: Validate[] } * @param {Object} options */ constructor(options) { this.options = options; } /** * check({key: value}) * @param {Object} keyVal */ check(keyVal) { const keys = Object.keys(keyVal); if (!keys.length) { throw new Error('至少的验证一个.') } // 只验证一个 const key = keys[0]; const val = keyVal[key]; if (!this.options.hasOwnProperty(key)) { throw new Error(`没有设置[${key}]的验证器.`) } for (let v of this.options[key]) { const errorMessage = v(val); if (errorMessage) { if (this.validateErrorListener && typeof this.validateErrorListener === 'function') { this.validateErrorListener(errorMessage) }else{ SyncValidate.validateErrorListener(errorMessage) } // 验证失败立即返回 return false; } } // 验证ok返回true return true; } checkAll(keysVals){ for (let key in keysVals) { if(this.check({ [key]: keysVals[key] }) === false){ return false; } } return true; } // 默认的验证错误时的回调函数 static validateErrorListener(errorMessage) { uni.showToast({ icon: 'none', title: errorMessage, duration: 1500 }); } // 添加验证错误时的回调函数 addValidateErrorListener(validateErrorListener) { this.validateErrorListener = validateErrorListener; } // 必填 static required(msg) { return (input) => { if (!input) return msg; } } // 最小长度 static minLength(len, msg) { return (input) => { if (input.length < len) return msg; } } // 最大长度 static maxLength(len, msg) { return (input) => { if (input.length > len) return msg; } } // 简单的验证手机号 static phone(msg, exp) { const phoneExp = exp || /^((13[0-9])|(14[0-9])|(15[0-9])|(16[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\d{8}$/; return (input) => { if (!input.match(phoneExp)) { return msg; } } } // 简单的判断相等 static eql(data, msg) { return (input) => { if(input !== data) return msg; } } // 简单的判断相等 static equal(data, msg) { return (input) => { if(input != data) return msg; } } } ``` ## 使用 ``` const syncValidate = new SyncValidate({ username: [ SyncValidate.required('用户名不能为空!'), SyncValidate.phone('请输入正确手机号!'), ], password: [ SyncValidate.required('密码不能为空!'), SyncValidate.minLength(8, '密码长度必须大于7'), ] }); syncValidate.addValidateErrorListener((errorMessage) => { uni.showToast({ icon: 'none', title: errorMessage, duration: 1500 }); }) onLogin() { if ( !syncValidate.check({username: this.username.trim()}) || !syncValidate.check({password: this.password.trim()}) ) { return; } ... } ```

    展开全文
  • 不同实例下同构表数据同步验证 背景 我们有一个测试需求,需把Azure sql database 下所有表数据同步到Sql server 下同构的表并保持一定时间间隔去自动同步数据,本想直接使用Azure portal 中复制数据库的功能,...
    不同实例下同构表数据同步验证

    背景

    我们有一个测试需求,需把Azure sql database 下所有表数据同步到Sql server 下同构的表并保持一定时间间隔去自动同步数据,本想直接使用Azure portal 中复制数据库的功能,可惜测试发现该功能限制了scheme下超500个表,开Case的答复暂时产品无法改变这个现状只能待后续完善。为了能实现这个持续进行数据同步需求,我们选用tablediff 来生成差异脚本,使用sqlcmd来执行差异脚本,上述两个工具都是sql server 自带的工具,先验证是否可行后续可以使用SSIS把上述两个步骤组合在一起最后通过JOB定期执行即可
    测试环境
    Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) Oct 28 2016 18:17:30 Copyright (c) Microsoft Corporation Web Edition (64-bit) on Windows Server 2016 Datacenter 6.3 <X64> (Build 14393: ) (Hypervisor) 
     

    准备测试对象

    --为了方便验证,我直接在同实例下新建了两个测试库
    --准备同步的库以及表 
    CREATE DATABASE test_db1;  --源库
    GO
    USE test_db1;
    CREATE TABLE test_table   --需同步的源表
    (
        id INT IDENTITY(1, 1),
        name NVARCHAR(20),
        location NVARCHAR(10)
    );
    GO
    
    
    CREATE DATABASE test_db2;   --目标库
    GO
    USE test_db2;
    CREATE TABLE test_table    --需同步的目标表
    (
        id INT IDENTITY(1, 1),
        name NVARCHAR(20),
        location NVARCHAR(10)
    );
    GO

     

     
    默认是在Sql Server中使用xp_cmdshell来调用tablediff ,当然也可以使用Windows Prompt 或者Powershell都可以调用;在SSMS开启xp_cmdshell
    --开启xp_cmdshell
    EXEC sp_configure 'xp_cmdshell', 1;
    RECONFIGURE;

     

    测试场景情况

    USE test_db1;  --源库
    INSERT INTO dbo.test_table   --源表
    (   name,
        location
    )
    VALUES
    (   N'1', -- name - nvarchar(20)
        N'2'  -- location - nvarchar(10)
    );

     

    执行如下语句
    EXEC master..xp_cmdshell '"C:\Program Files\Microsoft SQL Server\140\COM\tablediff.exe" -sourceserver [DESKTOP-0LI9ARF] -sourcedatabase test_db1 -sourcetable test_table -destinationserver [DESKTOP-0LI9ARF] -destinationdatabase test_db2 -destinationtable test_table -f D:\4_9\Diff';

     

    打开内容如下:
    看来一个表的数据是没有问题,我们试试在目标表提前插入2条记录看比对结果如何,注意需提前删除已生成的Diff.sql文件,否怎会提示该文件已存在;
    USE test_db2; --目标库
    INSERT INTO dbo.test_table --目标表
    (   name,
        location
    )
    VALUES
    (   N'23', -- name - nvarchar(20)
        N'232' -- location - nvarchar(10)
    );
    
    INSERT INTO dbo.test_table --目标表
    (   name,
        location
    )
    VALUES
    (   N'232', -- name - nvarchar(20)
        N'2233' -- location - nvarchar(10)
    );
    EXEC master..xp_cmdshell '"C:\Program Files\Microsoft SQL Server\140\COM\tablediff.exe" -sourceserver [DESKTOP-0LI9ARF] -sourcedatabase test_db1 -sourcetable test_table -destinationserver [DESKTOP-0LI9ARF] -destinationdatabase test_db2 -destinationtable test_table -f D:\4_9\Diff';

     

     
    测试一下无主键无自增字段的场景
    USE test_db1;      
    CREATE TABLE test_table2 --需同步的源表2
    (
        name NVARCHAR(20),
        location NVARCHAR(10)
    );
    GO
    
    
    USE test_db2;
    CREATE TABLE test_table2 --需同步的目标表2
    (
        name NVARCHAR(20),
        location NVARCHAR(10)
    );
    GO

     

     
    先测试源表有记录,目标表无记录场景
    USE test_db1; --目标库
    INSERT INTO dbo.test_table2 --目标表
    (   name,
        location
    )
    VALUES
    (   N'23', -- name - nvarchar(20)
        N'232' -- location - nvarchar(10)
    );
    
    INSERT INTO dbo.test_table2 --目标表
    (   name,
        location
    )
    VALUES
    (   N'232', -- name - nvarchar(20)
        N'2233' -- location - nvarchar(10)
    );
    EXEC master..xp_cmdshell '"C:\Program Files\Microsoft SQL Server\140\COM\tablediff.exe" -sourceserver [DESKTOP-0LI9ARF] -sourcedatabase test_db1 -sourcetable test_table2 -destinationserver [DESKTOP-0LI9ARF] -destinationdatabase test_db2 -destinationtable test_table2 -f D:\4_9\Diff1';

     

    看来没有唯一的字段是不行的,没有唯一字段的堆表,如需数据同步最少需手动添加一个自增字段才行;
    已生成的差异脚本如下图,剩下的步骤就是使用sqlcmd执行差异脚本。
    查询对应的目标表验证正常;
    为了与之前的数据比对测试一致,使用xp_cmdshell 调用sqlcmd如下
    EXEC master..xp_cmdshell '"C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn\sqlcmd.exe" -S DESKTOP-0LI9ARF -d test_db2 -i D:\4_9\Diff.sql -o D:\4_9\error1.txt';

     

     
    效果与 Command prompt一样;

    结论

    • 从上述测试来看基本验证此方案是可行,不过使用到生产环境就要做充分测试验证,如磁盘的IO到时是否会有瓶颈,网络情况等;
    • 注意tablediff的限制,满足比对的前提是要有【primary key】或【identity】或【ROWGUID 】,如没有就需手工增加一个,注意使用-strict 选项 会有一些限制注意查看官方文档;
    • 注意开启xp_cmdshell会有一定的安全风险;
    • 注意在sqlcmd 中字母区分大小写且有不同的含义,详情查看官方文档;

     

     
     
     
     

    转载于:https://www.cnblogs.com/jil-wen/p/10406991.html

    展开全文
  • 在这篇博客里,我将用redux-form实现一个同步验证的表单,它将满足以下条件: 1有三个输入框:用户名输入框(username),邮箱输入框(email)和年龄输入框(age) 2如果点击输入框获取焦点后未输入内容,则在输入框失去...

    在这篇博客里,我将用redux-form实现一个同步验证的表单,它将满足以下条件:

    1有三个输入框:用户名输入框(username),邮箱输入框(email)和年龄输入框(age)

    2如果点击输入框获取焦点后未输入内容,则在输入框失去焦点后发出错误(error)提示:XXX不能为空,且此时不能提交成功

    3如果在输入框中输入内容不合法,比如用户名过长(length>5)发出错误提示:不能大于五个字,且此时不能提交成功

    4如果在输入框中输入内容合法但需警告,则提示警告(warn)内容,此时虽然发出警告但仍能提交成功(请区分和2和3中的区别)

    5在尚未输入内容时(pristine=true)或在提交过程中(submitting=true),禁止使用提交按钮。在点击清空按钮时,调用reset()方法清空所有输入框中的内容

    复制代码
    import React from 'react'
    import { Field, reduxForm } from 'redux-form'
    

    const validate = values => {
    const errors = {}
    if (!values.username) {
    errors.username = ‘用户名不能为空’
    } else if (values.username.length > 5) {
    errors.username = ‘不能大于五个字’
    }
    if (!values.email) {
    errors.email = ‘邮箱不能为空’
    } else if (!/1+@[A-Z0-9.-]+.[A-Z]{2,4}$/i.test(values.email)) {
    errors.email = ‘Invalid email address’
    }
    if (!values.age) {
    errors.age = ‘年龄不能为空’
    } else if (isNaN(Number(values.age))) {
    errors.age = ‘年龄必须是一个数字’
    } else if (Number(values.age) < 18) {
    errors.age = ‘对不起,你未满18岁’
    }
    return errors
    }

    const warn = values => {
    const warnings = {}
    if (values.age < 19) {
    warnings.age = ‘你年龄还有点小哦!’
    }
    return warnings
    }

    const renderField = ({ input, label, type, meta: { touched, error, warning } }) => (
    <div>
    <label>{label}</label>
    <div>
    <input {…input} placeholder={label} type={type}/>
    {touched && ((error && <span>{error}</span>) || (warning && <span>{warning}</span>))}
    </div>
    </div>
    )

    const SyncValidationForm = (props) => {
    const { handleSubmit, pristine, reset, submitting } = props
    return (
    <form onSubmit={handleSubmit}>
    <Field name=“username” type=“text” component={renderField} label=“Username”/>
    <Field name=“email” type=“email” component={renderField} label=“Email”/>
    <Field name=“age” type=“number” component={renderField} label=“Age”/>
    <div>
    <button type=“submit” disabled={submitting}>Submit</button>
    <button type=“button” disabled={pristine || submitting} onClick={reset}>Clear Values</button>
    </div>
    </form>
    )
    }

    export default reduxForm({
      form: 'syncValidation',  //你的redux-form的特殊标记,必填项
      validate,                // 上面定义的一个验证函数,使redux-form同步验证
      warn                     // 上面定义的一个错误提示函数,使redux-form同步错误提示
    })(SyncValidationForm)//写入的redux-form组件
     
    复制代码

    1什么是Field组件?

    Field组件是redux-form组件库中的核心组件,它位于你的输入框(input)或输入框组件的外一层,将其包装起来从而使输入框能和redux的store直接连接起来。

    它有两个最重要的属性:name属性和component属性,且这两个属性都是必填项

    <Field name="username" type="text" component={renderField} label="Username"/>
    2Field组件的name属性和component属性

    name属性是Filed组件的名称,也即Field下输入框的名称,它将成为存储form表单数据的values对象中的属性名:比如?的SyncValidationForm的values对象在输入后是这样的:

    {
    username:彭湖湾,
    email:2314838003@qq.com,
    age:20
    }
    component属性的值是Field包裹的input组件,它可有三种形式: 1纯字符串如input, textarea 或者 select:
    <Field name="username" component="input" />
    组件名称:通过class定义的组件或者无状态函数组件(stateless function)

    <1>class定义

    复制代码
    class MyInput extends Component {
      render() {
       .......
      }
    }
    <Field name="myField" component={MyInput}/>
    复制代码
    2>无状态函数组件:
    const  Myinput = (props) => {
      return (<input ... />)
    }
    <Field name="myField" component={MyInput}/>
    注意!:只要写函数名即可,不要写html的格式,要写成component={Myinput}而不是component={}!

    3reduxForm(…)(yourForm)有何作用?

    熟悉redux数据流的同学应该对这个函数很熟悉吧,没错,它和redux的connect(…)(…)函数非常类似,通过

    reduxForm({
      form: 'syncValidation',  //你的redux-form的特殊标记,必填项
      validate,                // 一个验证函数,使redux-form同步验证
      warn                     // 一个错误提示函数,使redux-form同步错误提示
    })(SyncValidationForm)//写入的redux-form组件
    (这里的validate和warn采用了ES6的对象属性的简化写入写法,相当于validate:validate和warn:warn)

    一方面实现了对使redux-form实现了同步验证等功能,同时还将handleSubmit等自带的属性以props的形式传入SyncValidationForm中,使他“增强”了,是不是和connect(…)(…)很相似呢?然后通过

    const SyncValidationForm = (props) => {
      const { handleSubmit, pristine, reset, submitting } = props
        .....       
    }
    你就在SyncValidationForm中取到了这些属性值

    关于handleSubmit,pristine,reset和submitting的作用我这里简单介绍一下,详细的大家可以去看英文的API:

    handleSubmit是处理提交的一个函数,接收三个参数:values(即上文提到的保存表单数据的对象),dispatch和props(传递给自定义表单组件的属性)
    pristine是一个布尔型的值,如果表单初始化后尚未输入值,为true,否则为false,当你向表单中第一个输入框中输入值的时候,pristine就由true转为false了
    reset是一个函数,调用reset()可清空表单
    submitting是一个布尔型数值,true表示表单正在提交
    运行结果如下:

    1–验证是否为空
    在这里插入图片描述
    在这里插入图片描述


    1. A-Z0-9._%+- ↩︎

    展开全文
  • Ajax验证表单(同步验证

    千次阅读 2016-06-09 10:12:34
    在进行用户从注册的时候,进场需要校验email或username是否被注册,这时候需要ajax验证,但是ajax验证无法返回回调函数的值到外部的校验方法,如 function CheckForm(){  if($("#username").val() == ''){  $...
  • 在这篇博客中我将用redux-form实现一个同步验证的表单【相关知识点:react框架,redux数据流,ES6标准】
  • 一、表单验证错误提示方式 Ext.QuickTips.init(); //为Ext组件提供提示信息功能Ext.form.Field.prototype.msgTarget='side'; //指示错误出现的方式 qtip-当鼠标移动到控件上面时显示提示 //默认值为qtip,该方式...
  • mongo复制集同步验证

    2017-11-22 11:32:06
    第一步:在主节点上插入一条数据 rs0:PRIMARY> use imooc switched to db imooc rs0:PRIMARY> db.imooc.insert({"name":"imooc"}) ...第二步:在从节点查看数据,看是否同步 rs0:SECONDARY> use imooc sw
  • --replicate-check-only :只显示不同步的信息。 --replicate= :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中,(这里写入了tuge库的checksums) 如果没有checksums库.需要手工创建一个.每次监测...
  • 为什么用codeigniter框架集成支付宝接口,同步验证总返回验证失败? 为什么在$responseText=true;的情况下, $mysign!=$sign,签名不相等,求解,加分
  • 前段时间,公司跟别的公司签订合作伙伴,搞了一个第三方登录与数据共享同步,是基于OAuth2.0协议,现在空闲了,做一下笔记。 到github下载一个OAuth2.0的PHP类库(当然,你也可以自己写一个^-^,但个人觉得没必要造...
  • 1. 使用 ue 打开该 dmp 文件, 将文件头编号: 从 V11.02.00 修改为: V10.02.01 ...
  • 摘要:在Silverlight 4中,Silverlight Validation有相对的改进,本篇将介绍Silverlight 4中新加入的验证机制功能,IDataErrorInfo客户端同步验证机制  Silverlight 4 Validation验证实例系列 ...
  • 摘要:在Silverlight 4中,Silverlight Validation有相对的改进,本篇将介绍Silverlight 4中新加入的验证机制功能,IDataErrorInfo客户端同步验证机制  Silverlight 4 Validation验证实例系列 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,442
精华内容 2,176
关键字:

同步验证