元媛小说70本合集,麻烦分享一下百度云,谢谢了!

1073人阅读
微信中比较好用的接口功能里,微信收货地址接口应该算一个,它本身提供了地址的添加删除使用,可以使微商城省去收货地址开发的步骤。微支付这个步骤并不难,本身有提供demo给你,稍微改改就能用,看一下概念也清晰了。收货地址却没有。
此文章是以PHP来实现。
在做之前先确定自己有微信公众平台的账号,并且申请了微支付,至少完成了流程前三步。
首先确定一下自己的,及
这三个就不用说了,相信你们可以理解。
分别可以用PHP的&
$timestamp = time();
$noncestr = rand(999);
比较麻烦的是addrSign这个参数需要,,,及
需要先在公众平台后台开发者中心网页授权中设置可以获取授权的域名
代码如下:
&&进入&/a&
$url=&/wechatpay/addr.php&;
$info=urlencode($url);
对应的值必须是,则可以随便填写。请求这个链接后会跳转到$url这个地址
返回的链接中是带有code参数的,可以用$_GET获取。接着
$str=$_GET['code'];
$info=&https://api./sns/oauth2/access_token?appid={$appid}&secret={$appsecret}&code={$str}&grant_type=authorization_code&;
$data=file_get_contents(&$info&);
$user_array=json_decode(&$data&,true);&span style=&white-space:pre&& &/span&$accesstoken=$user_array['access_token'];
//通过file_get_contents获取json然后用json_decode转为数组,就可以得到access_token了~在此原谅我英文不好,所以命名方式有点难以理解2.获取调用接口的页面的URL
$url=&http://&.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];这样子是最不会出错了。
3.拼接算法。
进行加密的字段有,,,及。要进行字典序并且URL键值式拼接成字符串。(注意,参与签名的参数的必须小写,顺序按的)于是如下:
$data=array(&accesstoken&=&&{$accesstoken}&,&appid&=&&{$appid}&,&noncestr&=&&{$noncestr}&,&timestamp&=&&{$timestamp}&,&url&=&&{$url}&);
$signPars = '';
ksort($data);
foreach($data as $k =& $v) {
if(&& != $v && &sign& != $k) {
if($signPars == '')
$signPars .= $k . &=& . $v;
$signPars .=
&&&. $k . &=& . $v;
$addrSign = SHA1($signPars);
这样子就得出addrSign.接下去第二步了。
二.微信调用
必然是调用微信的JSAPI的代码,这是最关键的。细节错误一定要注意。
&span style=&font-family:Microsoft YaHbackground-color: rgb(153, 255, 153);&&&script language=&javascript&&&/span&&span style=&font-family:Microsoft YaH&&&span style=&background-color: rgb(153, 255, 153);&&function getaddr(){
WeixinJSBridge.invoke('editAddress',{
&/span&&span style=&background-color: rgb(255, 0, 0);&&&appId& : &&?php echo $appid ?&&,
&scope& : &jsapi_address&,
&signType& : &sha1&,
&addrSign& : &&?php echo $addrsign ?&&,
&timeStamp& : &&?php echo $timestamp ?&&,
&nonceStr& : &&?php echo $noncestr ?&&,&/span&&span style=&background-color: rgb(153, 255, 153);&&
},function(res){
&/span&&/span&&span style=&font-family:Microsoft YaH&&&span style=&background-color: rgb(153, 255, 153);&&//alert(res.err_msg);&/span&&/span&&span style=&font-family:Microsoft YaHbackground-color: rgb(153, 255, 153);&&if(res.err_msg == 'edit_address:ok'){
&/span&&span style=&font-family:Microsoft YaHbackground-color: rgb(153, 255, 153);&&alert(&收件人:&+res.userName+&  联系电话:&+res.telNumber+&  收货地址:&+res.proviceFirstStageName+res.addressCitySecondStageName+res.addressCountiesThirdStageName+res.addressDetailInfo+&  邮编:&+res.addressPostalCode);}&/span&&span style=&font-family:Microsoft YaHbackground-color: rgb(153, 255, 153);&&});}&/span&
&span style=&font-family:Microsoft YaHbackground-color: rgb(153, 255, 153);&&&/span&&pre name=&code& class=&html&&&input type=&submit& class=&submit& onclick=&getaddr()& value=&确定&/&
这一步要注意的是红色部分这些的参数必须是字符串格式。 可用alert测试一下弹出res.err_msg内容。
res.err.msg弹出的内容
除此之外,如果
是弹出access denied这个东西的话,或者无响应的话。。。那么你很有可能遇到跟我一样的问题,这个问题让我纠结了四天了。。。
就是,你要特别注意一点,收货地址的页面跟微信支付一样都要放在授权目录!!!只有授权目录才能调起来,我被坑了四天。。。T T。。。才有了写这个文章想法来提醒大家。
以下附图是注意的事项。如果还不行可以看看。
代码就到这里了,一般按流程来,是不会有什么问题的。相信这篇文章可以让你更快的理解使用。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1119次
排名:千里之外PHP实现电商订单自动确认收货redis队列
投稿:jingxian
字体:[ ] 类型:转载 时间:
下面小编就为大家带来一篇PHP实现电商订单自动确认收货redis队列。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
之前做的电商平台,用户在收到货之后,大部分都不会主动的点击确认收货,导致给商家结款的时候,商家各种投诉,于是就根据需求,要做一个订单在发货之后的x天自动确认收货。所谓的订单自动确认收货,就是在在特定的时间,执行一条update语句,改变订单的状态。
最笨重的做法,通过linux后台定时任务,查询符合条件的订单,然后update。最理想情况下,如果每分钟都有需要update的订单,这种方式也还行。奈何平台太小,以及卖家发货时间大部分也是密集的,不会分散在24小时的每分钟。那么,定时任务的话,查询过多,不适合。这里可以先把将要自动确认收货的订单信息存储到其他介质上,比如redis,memcache,rabbitmq,然后执行的脚本从前面的介质获取到订单信息来判断,这里可以大大的减少数据库的查询压力。
redis队列的生产者
对此,我们选择每天在凌晨两点的时候,通过linux的定时任务把即将要确认收货的订单信息查询出来,然后存储在redis上,redis上我们选择的队列,队列处理的特点就是先进先出,前面的数据在查询订单时,通过发货时间排序,所以最先出队列的肯定是距离规定的自动收货时间最近的订单。代码如下
$successCount=0;
$failCount=0;
$screen_time = ;//设置筛选天数
$data = array();
$now_time = time();
//查询符合要求的数据
$sql="select id,send_time as deliver_time from `order` where is_send=1 and is_del=0 and is_cancel=0 and is_token=0 and send_time&0 and send_time + {$screen_time} & $now_time
order by send_time asc";
$res = $con-&query($sql);
//当队列还有数据时将数据记录并清除
while($redis-&LLEN('auto_recevice_order')){
$txt = '执行时间:'.date('Y-m-d H:i:s').',信息:'.$redis-&RPOP('auto_recevice_order');
file_put_contents('./autoToken/fail_log.txt',$txt."\r\n".PHP_EOL,FILE_APPEND);
$failCount++;
//重新填充数据进队列
while ($row = $res-&fetch_assoc()) {
$successCount++;
$redis-&LPUSH('auto_recevice_order',json_encode($row1));
$con-&close();
$success=date('Y-m-d H:i:s').':[推送成功]:本次成功推送数据:'.$successCount.'条;记录上次处理失败数据:'.$failCount."条\r\n";
file_put_contents('./success_log.txt',$success."\r\n".PHP_EOL,FILE_APPEND);
redis队列的消费者
队列的消费者没有通过linux的定时任务去做,用linux的screen+php cli模式执行php脚本,消费者只需要不断的从队列中读取订单信息,然后判断订单信息中的发货时间,如果达到自动收货的要求,就执行update语句。同时如果没有达到收货的时间,而且与收货时间间距比较大的时候,可以让php脚本休眠sleep一定的时间数,这个时间数自己调节设计,获取出来的未达到时间要求的订单,需要重新推送到redis队列中去,而且还是队列的顶端。以便下次获取。代码如下:
$set_time = ;//设置几天后自动收货
while(true){
if($i%30==0){
usleep(10);//防止while 循环使CPU使用率过高
if($redis-&LLEN('auto_recevice_order')){
$data = json_decode($redis-&RPOP('auto_recevice_order'));
$id = (int)$data-&//将数据转化为整形
$deliver_time = (int)$data-&deliver_//将数据转化为整形
$res1 = $res2 =
$now_time = time();
if(($deliver_time+$set_time)&$now_time){
$sql1 = "update `order` set `is_token`='1',`token_time` = $now_time where id=$id and is_send=1 and is_del=0 and is_cancel=0 and is_token=0 and send_time + {$set_time} & $now_time";
$res1 = $con-&query($sql1);//更新数据
$rows = mysqli_affected_rows($con);
if($rows){
$ip = $this-&getIp();
$sql2 = "insert into `order_log`(`order_id`,`log_msg`,`log_ip`,`log_role`,`log_user`,`log_order_state`,`log_time`) VALUES($id,'系统自动收货','$ip','系统','服务器','收货',$now_time)";//写入订单日志
$res2 = $con-&query($sql2);//添加日志数据
if($res1==false){//将没达到条件的数据重新插入队列中
$redis-&RPUSH('auto_recevice_order',json_encode(array('id'=&$id,'deliver_time'=&$deliver_time)));
这里执行php脚本,需要用到linux的screen或者supervisor、nohup守护进程。具体用法可自行百度.同样脚本里面最好有必须的日志记录。
随着业务的增长,在队列中同一秒内,存在的多个需要处理的订单,而一次只能从队列中取出一个相关订单信息的时候,可以采用一个生产者多个消费者的模式,这种情况下,可以用到锁机制,保证一条消息只能到达一个消费者。当redis数据达到一定的量之后,也可以适当的调整生产者的执行频率和对应的条件。
以上这篇PHP实现电商订单自动确认收货redis队列就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信