标签 function 下的文章

生成唯一id算法Snowflake的php版本

生成唯一id,常见的函数uniqid()能保证唯一性不重复,但是它里面含有字母,所以搜索之后发现使用Snowflake算法是比较好的,不过只个算法也会产生重复,至少测试了网友写的php版本都会,所以自己进行改进,保证每秒能产生1万个不重复数据,十万会有五六个,如果加上用户id就能保证不会有重复数据,一般情况下1秒不可能写入这么多条数据,所以根据实际情况选择加入或不加入用户id;

function sn(){
 $time = floor(microtime(true) * 1000);
$base = decbin($time);
$machineid = str_pad(decbin(mt_rand(0, 1023)), 10, "0", STR_PAD_LEFT);
$random = str_pad(decbin(mt_rand(0, 4095)), 12, "0", STR_PAD_LEFT);
$str = $base.$machineid.$random;
return number_format(bindec($str),0,"","");
}

这个函数生成16位的全数字id;可用于一般生成订单,生成文件名,图片名,地址规则,中奖码等,当然对于文件名,图片名可以有字母的推荐uniqid()函数,内置函数速度更快,对于纯数字的可以选用此函数.


扫码二维码阅读

微擎js支付中的应用讲解和代码实例

js支付体验好,不需要跳转,直接在本页面内完成支付,但是微擎给的代码非常简单,在实际开发中还是有很多的坑,感谢黄河指导,完成了支付的开发.

首先需要配置支付信息,在这里不多说了,主要是微擎后台和商户里面,重点说开发.先说前端,对于我们没有加载微擎公共开头结尾,那就要自己加载一些必须的代码.

<a href="javascript:void(0);" data-name="李白"  class="weui_btn weui_btn_plain_primary weui_btn_inline">支付</a>
<?php
$wx = $_W['account']['jssdkconfig'];
$wx['url'] ='http://'.$_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ;
?>
<script>
    window.sysinfo = {"uniacid":{php echo $this->weid},"acid":{$_W['acid']}};

    var appIdstr = "{$wx['appId']}";
    var timestampstr = "{$wx['timestamp']}";
    var nonceStrstr = "{$wx['nonceStr']}";
    var signaturestr = "{$wx['signature']}";
wx.config({
    debug: false,
    appId: appIdstr,
    timestamp: timestampstr,
    nonceStr: nonceStrstr,
    signature: signaturestr,
        jsApiList: [
        'checkJsApi',
        'onMenuShareTimeline',
        'onMenuShareAppMessage','showMenuItems','hideOptionMenu','chooseWXPay',
    ]
});
</script>
<script type="text/javascript" src='http://res.wx.qq.com/open/js/jweixin-1.0.0.js'></script>
 <script src="{php echo $this->yobyurl}zepto.min.js"></script>
<script type="text/javascript" src="{$_W['siteroot']}app/resource/js/lib/mui.min.js"></script>
<script type="text/javascript" src="{$_W['siteroot']}app/resource/js/app/util.js"></script>
<script>
$(function(){

document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {

$('.weui_btn').click(function(){
        $.getJSON("{$ajaxurl}",{name:name}, function(data, status){
        //这里传递参数到生成订单
            if(status == 'success'){
           
                util.pay({
                    orderFee : data.fee,
                    payMethod : 'wechat',
                    orderTitle : '微信支付金额' + data.fee + '元',
                    orderTid : data.ordertid,
                    module : 'yoby_test',
                    success : function(result) {//支付成功
                    $.alert('支付成功');
                   //可不写   
                    },
                    fail : function(result) {//支付失败
                       $.alert('支付失败');
                    },
                    complete : function(result) {//无论成功失败
                    //可不写
                    }
                });
            }
        });
       
        });
});
});

</script>

js代码就上面这么多,当然实际开发中需要自己调整代码,接着需要在site.php里面重要两个方法,一个是生成订单,一个是成功支付后的业务处理.开发终是不能传递参数到支付后的,所以首先把需要参数保存到订单中,一般

    public function doMobilepay() {//生成订单 $ajaxurl就是指向这里的方法
echo json_encode(array('fee'=>$n,'ordertid'=>$sn));//生成订单要返回一个json,一般包括金额和订单号即可,注意订单号需要唯一
}

public function payResult($params) {//支付成功处理,非常重要,你支付后业务处理要放到这里面
if ($params['result'] == 'success' && $params['from'] == 'notify') {//里面放业务代码
需要注意,这里面$_W['openid']是获取不到的,用下面代码
$uid = $params['tag']['uid'];
$openid = $params['user'];
$weid = $params['uniacid'];
$tid=$params['tid'];//这就是生成的唯一订单号 
$fee = $params['fee'];//金额
然后到订单表查询这个订单的信息包括传递的参数

}

}

到此支付开发就完成了,送一个生成订单函数

//生成sn订单,22位
function sn(){
return date('YmdHis').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
}

支付涉及钱的处理,所以要经过多重测试,可以用0.01元来测试,确认没问题再正式上线,有条件可以公测.开发中订单表至少包含金额,订单号,openid,weid以及传递的参数字段.


扫码二维码阅读