标签: 微信

  • php 一个文件搞定  提交付款码支付 应用场景

    php 一个文件搞定 提交付款码支付 应用场景

    应用场景

    收银员使用扫码设备读取微信用户付款码以后,二维码或条码信息会传送至商户收银台,由商户收银台或者商户后台调用该接口发起支付。

    提醒1:提交支付请求后微信会同步返回支付结果。当返回结果为“系统错误”时,商户系统等待5秒后调用【查询订单API】,查询支付实际交易结果;当返回结果为“USERPAYING”时,商户系统可设置间隔时间(建议10秒)重新查询支付结果,直到支付成功或超时(建议30秒);

    提醒2:在调用查询接口返回后,如果交易状况不明晰,请调用【撤销订单API】,此时如果交易失败则关闭订单,该单不能再支付成功;如果交易成功,则将扣款退回到用户账户。当撤销无返回或错误时,请再次调用。注意:请勿调用扣款后立即调用【撤销订单API】,建议至少15s后再调用。撤销订单API需要双向证书。

    官方文档地址:https://pay.weixin.qq.com/wiki/doc/api/micropay_sl.php?chapter=9_10&index=1

    具体代码

    建立文件pay.php

    <?php
    $key = "0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";						//微信商户API密钥
    $arr['auth_code'] = $_GET['auth_code'];
    $arr['appid']  = "xxxxxxxxxxxxxxxxxx";								//应用APPID
    $arr['mch_id'] = "1311111111";												//微信支付商户号
    $arr['sub_mch_id'] = '1561111111';										//子商户号
    $arr['out_trade_no'] = date('YmdHis').rand(1000,9999);//平台内部订单号
    $arr['body'] = "扫码支付";														//内容
    $arr['total_fee'] = 1; 																//金额
    $arr['nonce_str'] = md5(rand(1000, 999999));					//随机字符串
    $arr['spbill_create_ip'] = $_SERVER['REMOTE_ADDR'];   //获得用户设备IP 
    ksort($arr);
    $sign_tmp = $xml_tmp = '';
    foreach($arr as $k => $v){
    	$sign_tmp .= "$k=$v&";
    	$xml_tmp .= "<$k>$v</$k>";
    }
    $sign = strtoupper(MD5($sign_tmp . "key=$key")); 				//MD5后转换成大写
    $xml = "<xml>$xml_tmp<sign>$sign</sign></xml>";
    $url = "https://api.mch.weixin.qq.com/pay/micropay";		//微信传参地址
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);									//设置超时
    curl_setopt($ch,CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);								//设置header
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 				//要求结果为字符串且输出到屏幕上
    curl_setopt($ch, CURLOPT_POST, TRUE);										//POST提交方式
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
    $dataxml = curl_exec($ch);															//运行curl
    if(!$dataxml){
        $error = curl_errno($ch);
        echo "curl出错,错误码:$error"."<br>";
    }
    curl_close($ch);
    //将微信返回的XML 转换成数组
    $rs = (array)simplexml_load_string($dataxml, 'SimpleXMLElement', LIBXML_NOCDATA); 
    echo 'over';
    print_r($rs);

    拼接后的XML举例如下:

    <xml>
       <appid>wx2421b1c4370ec43b</appid>
       <attach>订单额外描述</attach>
       <auth_code>120269300684844649</auth_code>
       <body>付款码支付测试</body>
       <device_info>1000</device_info>
       <goods_tag></goods_tag>
       <mch_id>10000100</mch_id>
    <sub_mch_id>10000101</sub_mch_id>
       <nonce_str>8aaee146b1dee7cec9100add9b96cbe2</nonce_str>
       <out_trade_no>1415757673</out_trade_no>
       <spbill_create_ip>14.17.22.52</spbill_create_ip>
       <time_expire></time_expire>
       <total_fee>1</total_fee>
       <sign>C29DB7DB1FD4136B84AE35604756362C</sign>
    </xml>

    注:参数值用XML转义即可,CDATA标签用于说明数据不被XML解析器解析。

    使用方法

    pay.php?auth_code=135610584558

    将下图中的二维码数字输入auth_code值中即可。

  • Python微信红包代码实例 微信红包的架构设计

    Python微信红包代码实例 微信红包的架构设计

    Python微信红包算法实例

    #!/usr/bin/env python
    # coding: utf-8
    import random
    # m : 红包个数
    # n : 红包人数
    # packet : 本次抢到的金额 , 所有金额以分为计算
    def redEnvelope(m,n):
        remain = m*100 #剩余金额
        nn = n #剩余人数
        for i in range(1,n):
            if remain == 0 :
                print('已经全部发完了')
            else :
                packet = random.randint(1,int(remain/nn*2))
                nn -= 1
                remain -= packet 
                print('第%d位成员红包的金额为%.2f元 , 余额为%.2f , 剩余%d人未领红包'%(i,packet/100,remain/100,nn))
        print('最后一个成员红包金额为%.2f元'%(remain/100))

    Python调用方法

    redEnvelope(100,4)

    运行结果

    第1位成员红包的金额为45.65元 , 余额为54.35 , 剩余3人未领红包
    第2位成员红包的金额为16.10元 , 余额为38.25 , 剩余2人未领红包
    第3位成员红包的金额为20.98元 , 余额为17.27 , 剩余1人未领红包
    最后一个成员红包金额为17.27元

    概况:2014年微信红包使用数据库硬抗整个流量,2015年使用cache抗流量。

    微信的金额什么时候算?

    答:微信金额是拆的时候实时算出来,不是预先分配的,采用的是纯内存计算,不需要预算空间存储。。
    采取实时计算金额的考虑:预算需要占存储,实时效率很高,预算才效率低。

    实时性:为什么明明抢到红包,点开后发现没有?

    答:2014年的红包一点开就知道金额,分两次操作,先抢到金额,然后再转账。
    2015年的红包的拆和抢是分离的,需要点两次,因此会出现抢到红包了,但点开后告知红包已经被领完的状况。进入到第一个页面不代表抢到,只表示当时红包还有。

    分配:红包里的金额怎么算?为什么出现各个红包金额相差很大?

    答:随机,额度在0.01和剩余平均值*2之间。
    例如:发100块钱,总共10个红包,那么平均值是10块钱一个,那么发出来的红包的额度在0.01元~20元之间波动。
    当前面3个红包总共被领了40块钱时,剩下60块钱,总共7个红包,那么这7个红包的额度在:0.01~(60/7*2)=17.14之间。
    注意:这里的算法是每被抢一个后,剩下的会再次执行上面的这样的算法(Tim老师也觉得上述算法太复杂,不知基于什么样的考虑)。 这样算下去,会超过最开始的全部金额,因此到了最后面如果不够这么算,那么会采取如下算法:保证剩余用户能拿到最低1分钱即可。 如果前面的人手气不好,那么后面的余额越多,红包额度也就越多,因此实际概率一样的。

    红包的设计

    答:微信从财付通拉取金额数据郭莱,生成个数/红包类型/金额放到redis集群里,app端将红包ID的请求放入请求队列中,如果发现超过红包的个数,直接返回。根据红包的裸祭处理成功得到令牌请求,则由财付通进行一致性调用,通过像比特币一样,两边保存交易记录,交易后交给第三方服务审计,如果交易过程中出现不一致就强制回归。

    发性处理:红包如何计算被抢完?

    答:cache会抵抗无效请求,将无效的请求过滤掉,实际进入到后台的量不大。cache记录红包个数,原子操作进行个数递减,到0表示被抢光。财付通按照20万笔每秒入账准备,但实际还不到8万每秒。

    通如何保持8w每秒的写入?

    答:多主sharding,水平扩展机器。

    据容量多少?

    答:一个红包只占一条记录,有效期只有几天,因此不需要太多空间。

    询红包分配,压力大不?

    答:抢到红包的人数和红包都在一条cache记录上,没有太大的查询压力。

    一个红包一个队列?

    答:没有队列,一个红包一条数据,数据上有一个计数器字段。

    有没有从数据上证明每个红包的概率是不是均等?

    答:不是绝对均等,就是一个简单的拍脑袋算法。

    拍脑袋算法,会不会出现两个最佳?

    答:会出现金额一样的,但是手气最佳只有一个,先抢到的那个最佳。

    每领一个红包就更新数据么?

    答:每抢到一个红包,就cas更新剩余金额和红包个数。

    红包如何入库入账?

    数据库会累加已经领取的个数与金额,插入一条领取记录。入账则是后台异步操作。

  • 微信小视频等素材下载保存到电脑 图文教程

    新版微信朋友圈可以发小视频了,而近日看到很多朋友发的视频想保存下了,点击却发现只有“收藏”或举报功能。而收藏的在清理垃圾后又得在线重新下载才行,总之,最好还是保存到电脑最好了。那新版的微信怎么将朋友圈的小视频下载保存到电脑上才是上策。这里我们还是用电脑来操作方便。

    1.登录到电脑版微信。

    2.打开“设定”–“文件管理”

    20161019103337

    3.打开对应的“用户”–“video”文件夹即可。

    20161019103554

    这里已被保存为.mp4视频了。

     

  • 微信公众平台三方接入技术问题总结

    总结一下微信公众平台开发中遇到的问题,这里广告一下。

    各位可以关注我们的公众号:WeLoveLei

    • redirect_uri参数错误解决方法:

    1. 首先登录管理后台

      redirect_uri参数错误解决方法 微信公众平台
    2. ?点击开发者中心
      redirect_uri参数错误解决方法 微信公众平台
    3. ?向下滚动并找到?网页账号,并点击修改
      redirect_uri参数错误解决方法 微信公众平台
    4. ?填写自己的域名
      redirect_uri参数错误解决方法 微信公众平台
    5. ?点击确认后,即时生效,赶快试试吧。

    转自:http://jingyan.baidu.com/article/91f5db1b3659811c7e05e357.html

    • 防欺诈盗号请勿支付或输入qq密码

    通过微信公众平台的自定义菜单外链的网页时,在输入内容时会显示“防欺诈盗号,请勿支付或输入qq密码”,下面就分享一下如何去除微信顶部的“防欺诈盗号,请勿支付或输入qq密码”提示信息。

    1. 目前只有已经通过微信认证的账号可以去除这个提示,如果还没认证请先认证。

      防欺诈盗号请勿支付或输入qq密码
    2. ?找到左侧导航菜单中的“公众号设置”,并打开。
      QQ截图20151104093304
    3. ?打开“功能设置”,找到“业务域名”
      QQ截图20151104093420
    4. 点击“设置”,写入外链的域名,域名必须通过ICP备案,有三个域名可以填写。
      QQ截图20151104093457
      完成后即时生效!
WeChat