php版微信随机红包发放接口api接口

 更新时间:2016年11月25日 16:17  点击:2044
微信红包的原因就是通过指定的标识获得商户的信息然后进行发红包了,这个功能不简单并且要申请与验证和操作都非常的麻烦了,下面来看看微信红包api接口开发例子。

人工手动发放

商户在已经获知要发送的用户的openid情况下,可以将openid编辑成txt文件,直接登录微信支付商户平台,同样在“资金管理-现金管理”中充值后,创建要发放的红包,并填写金额等相关信息,再根据指引操作即可。

系统自动发放

商户需先发送邮件至wxhongbao@tencent.com获取流程指引,再登录商户平台(pay.weixin.qq.com ),在“资金管理-现金管理”中充值;然后即可自行根据开发文档进行开发,并发放现金红包,我们重点讲系统发布。

首先,商户调用微信红包接口时,服务器会进行证书验证,所以要在商户平台下载证书。在管理后台的“账户信息”里找到“安全设置”就可以下载了证书了。

微信平台红包开启教程

接着就是向帐号中充值,因为发放现金红包将扣除商户的可用余额,所以需要预先充值,确保可用余额充足。进入“资金管理”菜单找到“现金管理”,在此进行充值,保证帐号有余额可以进行红包发放。

微信平台红包开启教程

 

 

根据微信高级红包接口,开发PHP版本的API接口,现在进行主要代码分析

红包接口调用请求代码,所有请求参数为必填参数与文档对应:
class Wxapi {
    private $app_id = 'wxXXXXXXXXXXXX'; //公众账号appid,首先申请与之配套的公众账号
    private $app_secret = 'XXXXXXXXXXXXXXXXXXXXXXXX';//公众号secret,用户获取用户授权token
    private $app_mchid = 'XXXXXXXX';//商户号id
    function __construct(){
    //do sth here....
    }
    /**
     * 微信支付
     * @param string $openid 用户openid
     */
    public function pay($re_openid)
    {
        include_once('WxHongBaoHelper.php');
        $commonUtil = new CommonUtil();
        $wxHongBaoHelper = new WxHongBaoHelper();
        $wxHongBaoHelper->setParameter("nonce_str", $this->great_rand());//随机字符串,丌长于 32 位
        $wxHongBaoHelper->setParameter("mch_billno", $this->app_mchid.date('YmdHis').rand(1000, 9999));//订单号
        $wxHongBaoHelper->setParameter("mch_id", $this->app_mchid);//商户号
        $wxHongBaoHelper->setParameter("wxappid", $this->app_id);
        $wxHongBaoHelper->setParameter("nick_name", '红包');//提供方名称
        $wxHongBaoHelper->setParameter("send_name", '红包');//红包发送者名称
        $wxHongBaoHelper->setParameter("re_openid", $re_openid);//相对于医脉互通的openid
        $wxHongBaoHelper->setParameter("total_amount", 100);//付款金额,单位分
        $wxHongBaoHelper->setParameter("min_value", 100);//最小红包金额,单位分
        $wxHongBaoHelper->setParameter("max_value", 100);//最大红包金额,单位分
        $wxHongBaoHelper->setParameter("total_num", 1);//红包?Х抛苋耸?br />         $wxHongBaoHelper->setParameter("wishing", '感谢您参与红包派发活动,祝您新年快乐!');//红包祝福诧
        $wxHongBaoHelper->setParameter("client_ip", '127.0.0.1');//调用接口的机器 Ip 地址
        $wxHongBaoHelper->setParameter("act_name", '红包活动');//活劢名称
        $wxHongBaoHelper->setParameter("remark", '快来抢!');//备注信息
        $postXml = $wxHongBaoHelper->create_hongbao_xml();
        $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';
        $responseXml = $wxHongBaoHelper->curl_post_ssl($url, $postXml);
        //用作结果调试输出
        //echo htmlentities($responseXml,ENT_COMPAT,'UTF-8');
    $responseObj = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA);
    return $responseObj->return_code;
    }
获取随机字符串方法:

/**
 * 生成随机数
 */    
public function great_rand(){
    $str = '1234567890abcdefghijklmnopqrstuvwxyz';
    for($i=0;$i<30;$i++){
        $j=rand(0,35);
        $t1 .= $str[$j];
    }
    return $t1;   
}
签名算法:


/**
例如:
appid:    wxd111665abv58f4f
mch_id:    10000100
device_info:  1000
Body:    test
nonce_str:  ibuaiVcKdpRxkhJA
第一步:对参数按照 key=value 的格式,并按照参数名 ASCII 字典序排序如下:
stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_i
d=10000100&nonce_str=ibuaiVcKdpRxkhJA";
第二步:拼接支付密钥:
stringSignTemp="stringA&key=192006250b4c09247ec02edce69f6a2d"
sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A
9CF3B7"
*/
protected function get_sign(){
    define('PARTNERKEY',"QSRXXXXXXXXXXXXXXXXXXXXX");
    try {
        if (null == PARTNERKEY || "" == PARTNERKEY ) {
           throw new SDKRuntimeException("密钥不能为空!" . "<br>");
        }
        if($this->check_sign_parameters() == false) {   //检查生成签名参数
           throw new SDKRuntimeException("生成签名参数缺失!" . "<br>");
        }
        $commonUtil = new CommonUtil();
        ksort($this->parameters);
        $unSignParaString = $commonUtil->formatQueryParaMap($this->parameters, false);
        $md5SignUtil = new MD5SignUtil();
        return $md5SignUtil->sign($unSignParaString,$commonUtil->trimString(PARTNERKEY));
    }catch (SDKRuntimeException $e)
    {
        die($e->errorMessage());
    }
 
}
CURL请求以及发送证书:

function curl_post_ssl($url, $vars, $second=30,$aHeader=array())
{
    $ch = curl_init();
    //超时时间
    curl_setopt($ch,CURLOPT_TIMEOUT,$second);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
    //这里设置代理,如果有的话
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);    
    //cert 与 key 分别属于两个.pem文件
    //请确保您的libcurl版本是否支持双向认证,版本高于7.20.1
    curl_setopt($ch,CURLOPT_SSLCERT,dirname(__FILE__).DIRECTORY_SEPARATOR.'zhengshu'.DIRECTORY_SEPARATOR.'apiclient_cert.pem');
    curl_setopt($ch,CURLOPT_SSLKEY,dirname(__FILE__).DIRECTORY_SEPARATOR.'zhengshu'.DIRECTORY_SEPARATOR.'apiclient_key.pem');
    curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).DIRECTORY_SEPARATOR.'zhengshu'.DIRECTORY_SEPARATOR.'rootca.pem');
    if( count($aHeader) >= 1 ){
        curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
    }
    curl_setopt($ch,CURLOPT_POST, 1);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);
    $data = curl_exec($ch);
    if($data){
        curl_close($ch);
        return $data;
    }
    else {
        $error = curl_errno($ch);
        //echo "call faild, errorCode:$error\n";
        curl_close($ch);
        return false;
    }
}

入口文件:


@require "pay.php";
//获取用户信息
$get = $_GET['param'];
$code = $_GET['code'];
//判断code是否存在
if($get=='access_token' && !empty($code)){
    $param['param'] = 'access_token';
    $param['code'] = $code;
    $packet = new Packet();
    //获取用户openid信息
    $userinfo = $packet->_route('userinfo',$param);
    if(empty($userinfo['openid'])){
        exit("NOAUTH");
    }
    //调取支付方法
    $packet->_route('wxpacket',array('openid'=>$userinfo['openid']));
}else{
    $packet->_route('userinfo');
}

开发所需文档:

1)官方红包高级接口文档

2)官方公众平台获取用户基本信息接口文档

3)商户平台开发文档

CORS实现POST方式跨域请求数据以前利用iframe时有用到过了,这里再整一个例子供各位参考,此例子是用于js的ajax中哦。


CORS全名Cross-Origin Resource Sharing,顾名思义:跨域分享资源,这是W3C制定的跨站资源分享标准。

目前包括IE10+、chrome、safari、FF都提供了XMLHttpRequest对象对该标准的支持,在更老的IE8中则提供了xDomainRequest对象,部分实现了该标准;

下面是创建request对象的代码:

var url = "http://www.111cn.net /1.php";

if (XMLHttpRequest) {
    var req = new XMLHttpRequest();
    // 利用withCredentials属性来判断是否支持跨域请求
    if (!("withCredentials" in req)) { // w3c先行
        if (window.XDomainRequest) {
            req = new XDomainRequest();
        }
    }
    req.open('POST', url, true);
    req.onload = function (data) {
        alert(this.responseText);
    };
    req.send();
}

注意xDomainRequest对象只支持http和https协议

在利用XMLHttpRequest对象发POST请求前会发一个options嗅探来确定是否有跨域请求的权限;同时在header头上带上Origin信息来指示来源网站信息,服务器响应时需要带上Access-Control-Allow-Origin头的值是否和Origin信息相匹配。

header("Access-Control-Allow-Origin: http://localhost"); // *为全部域名

CORS的缺点是你必须能控制服务器端的权限,允许你跨域访问

设置CORS实现跨域请求

一、使用php代码实现

#
# CORS config for php
# Code by anrip[mail@anrip.com]
#
 
function make_cors($origin = '*') {
 
    $request_method = $_SERVER['REQUEST_METHOD'];
 
    if ($request_method === 'OPTIONS') {
 
        header('Access-Control-Allow-Origin:'.$origin);
        header('Access-Control-Allow-Credentials:true');
        header('Access-Control-Allow-Methods:GET, POST, OPTIONS');
 
        header('Access-Control-Max-Age:1728000');
        header('Content-Type:text/plain charset=UTF-8');
        header('Content-Length: 0',true);
 
        header('status: 204');
        header('HTTP/1.0 204 No Content');
 
    }
 
    if ($request_method === 'POST') {
 
        header('Access-Control-Allow-Origin:'.$origin);
        header('Access-Control-Allow-Credentials:true');
        header('Access-Control-Allow-Methods:GET, POST, OPTIONS');
 
    }
 
    if ($request_method === 'GET') {
 
        header('Access-Control-Allow-Origin:'.$origin);
        header('Access-Control-Allow-Credentials:true');
        header('Access-Control-Allow-Methods:GET, POST, OPTIONS');
 
    }
 
}


二、使用nginx配置实现


# CORS config for nginx
# Code by anrip[mail@anrip.com]
#
 
location / {
 
    set $origin '*';
 
    if ($request_method = 'OPTIONS') {
 
        add_header 'Access-Control-Allow-Origin' $origin;
 
        #
        # Om nom nom cookies
        #
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
 
        #
        # Custom headers and headers various browsers *should* be OK with but aren't
        #
        add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
 
        #
        # Tell client that this pre-flight info is valid for 20 days
        #
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain charset=UTF-8';
        add_header 'Content-Length' 0;
 
        return 204;
 
    }
 
    if ($request_method = 'POST') {
 
        add_header 'Access-Control-Allow-Origin' $origin;
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
 
    }
 
    if ($request_method = 'GET') {
 
        add_header 'Access-Control-Allow-Origin' $origin;
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
 
    }
 
}

对于PHP多态大在学时后面的教程没人教自己也没有看懂,在实际应用中PHP多态用到也是非常的少了,下面整理了一篇关于PHP多态的例子。


多态这个概念,在Java中指的是变量可以指向的对象的类型,可是变量声明类型的子类。对象一旦创建,它的类型是不变的,多态的是变量。
在PHP5中,变量的类型是不确定的,一个变量可以指向任何类型的数值、字符串、对象、资源等。我们无法说PHP5中多态的是变量。


我们只能说在PHP5中,多态应用在方法参数的类型提示位置。
一个类的任何子类对象都可以满足以当前类型作为类型提示的类型要求。所有实现这个接口的类,都可以满足以接口类型作为类型提示的方法参数要求,通俗来讲多态就是指同一东西的多种表现形式;

看如下代码:

 

abstract class A{    
    public abstract function abc();
}
 
class AB extends A{
    public function abc(){
        echo 'ab';
    }
}
 
class AC extends A{
    public function abc(){
        echo 'ac';
    }
}
 
class T{
    public function abc(){
        echo 't'
    }
}
 
class Client{
    public static function call(A $obj){
        $obj-&gt;abc();
    }
}
 
Client::call(new AB());//ab
Client::call(new AC());//ac
Client::call(new T()); //error  Client类的方法应该为   public static function call($obj){      $obj-&gt;climb();   }
 

如我们创建一个doing()方法,如果是学生则打印上课,如是公司职员则打印上班。

普通做法

使用if判断

/**
 * PHP多态性
 * 琼台博客
 */
 
// 定义学生类
class student{
    public function cla(){
            echo "学生工正在上课!<br />";
    }
}
 
// 定义职员类
class office{                              
        public function Wor(){
            echo "职员正在上班!<br />";
        }
}
 
// 判断对象类型方法
function doing($obj){ 
        if($obj instanceof student){ 
            $obj->cla();
        }elseif($obj instanceof office){
            $obj->wor();
        }else{
            echo "没有这个对象!";
        }
}
 
doing(new student()); // 学生正在上课
doing(new office());  // 职员正在上班

以上结果输出:

学生正在上课

职员正在上班

这种普通方法有个缺点,就是对象如果很多,那么if..else..很长,不灵活。

 

多态性做法
定义一个公共抽象方法,所有子类继承它。

/**
 * PHP多态性
 * 琼台博客
 */
 
// 定义一个公共类
class pub{
    protected function working(){
        echo "本方法需要在子类中重载!";
    }
}
 
// 定义学生类,继承公共类pub
class student extends pub{
    public function working(){
        echo "学生工正在上课!<br />";
    }
}
 
// 定义职员类,继承公共类pub
class office extends pub{
        public function working(){
        echo "职员正在上班!<br />";
        }
}
 
// 判断对象类型方法
function doing($obj){ 
        if($obj instanceof pub){ 
            $obj->working();
        }else{
            echo "没有这个对象!";
        }
}
 
doing(new student()); // 学生正在上课
doing(new office());  // 职员正在上班

这就是多态的特性,灵活重用。


其它做法

从多态性的实现方式来看,无非就规范了每个类都要重载父类的一个方法,从而达到统一效果。而我们在定义类的时候,自行加上统一的方法也可行。因此以上例子也可以这么实现:
/**
 * PHP多态性
 * 琼台博客
 */
 
// 定义学生类
class student{
    // 定义统一的方法pub
    public function pub(){
        echo "学生工正在上课!<br />";
    }
}
 
// 定义职员类
class office{
    // 定义统一的方法pub
        public function pub(){
        echo "职员正在上班!<br />";
        }
}
 
// 判断对象类型方法
function doing($obj){ 
    if($obj){
        // 调用类的统一方法
            $obj->pub();
    }else{
        echo '没有这个对象';  
    }
}
 
doing(new student()); // 学生正在上课
doing(new office());  // 职员正在上班

当然,以上的例子不能说明多态性就能使用这样的方式搞定,毕竟多态性在复杂的程序设计中,它能有效的达到灵活重用的特性。

多态性也可以理解为一种程序设计方式,而程序设计最终目的无非就是:灵活,多态,重用,高效。

本文是我们总结的在Drupal开发中,一键隐藏管理导航相关模块及站内键盘导航相关模块,希望对drupal感兴趣的朋友有所帮助。

一键隐藏管理导航相关模块

在我们平时做项目时一般必装一个管理导航,要么是内置的Toolbar,要么是老牌的Administration menu,要么就是新贵Navbar,因为管理员总是需要这个东西,开发者有时也很需要。但其带来便利的同时,也在屏幕上占了一块地方,所以有时我们或者客户需要隐藏他们,在需要的时候再通过快捷键呼出。

这个需求Drupal社区中也给我们提供了解决方法,本文列出几个备选项,有此需求的朋友可以试试看。

Admin Toggle


Admin Toggle模块旨在隐藏一些页面元素使得管理员可以在管理员视角和匿名用户视角来回切换,在这个背景下,这个模块首先就实现了对Toolbar或Administration menu的隐藏,同时还可以隐藏一些管理区块,比如Devel模块那个。

Admin Menu Hider

Admin Menu Hider模块通过快捷键可以控制Administration menu的显式和隐藏,类似的模块是Toolbar Hider。

Toolbar Hider


htt<a href=

Toolbar Hider模块提供了一个很有意思的功能,就是通过快捷键控制Drupal7的Toolbar的显示和隐藏,有时候管理员也不希望总看到Toolbar,所以这个模块对管理员来说也挺有用的。



站内键盘导航相关模块


站内键盘导航这个需求在网站上用的比较少,但是如果你是一个Mac用户,你一定知道Spotlight,或者Alfred。这个功能实际体验的话,真的很方便。

Drupal社区竟然有这样的模块,而且有的做的相当不错,推荐大家试试,本站比较推荐第一个。

Coffee


Coffee模块是一个用于管理员通过键盘在网站进行快速导航的工具模块,类似于 Mac 上的 Alfred (link is external) 和 Spotlight (link is external)。

EazyLaunch


EazyLaunch模块是一个快速的基于文本输入的启动器,用于快速地在整个菜单系统中导航,任何页面只需按Ctrl+Z即可调出输入框,输入关键字时还可以给出提示。

特性:

Teleport


Teleport模块是一个键盘快捷导航模块,只支持Drupal6,灵感来自于Quicksilver和Gnome Do。

快捷键是ctrl+m,输入路径或者路径标题关键字定位,可以直接提交,如果不是一个完整路径,模块会自己猜测你可能想去的地方。

Cobalt


Cobalt模块是一个快捷键盘导航模块,类似于Gnome Do或者Mac下的Quicksilver。你可以搜索路径关键字,支持中英文,支持多种浏览器。

触发的键盘快捷键是alt+空格。


Stream其实是一个抽象的概念,类似于传输层,位于文件系统的下层。php本身是支付StreamWrapper的,不过Drupal对其进行完善,本文我们来看看底层File System和Stream Wrapper的原理。

在Drupal7以及PHP(也不知那个版本)后,多了一个概念:Stream,主要用来表示文件流。BTW,追溯起Stream的概念,这个应该很早在Java和C#等OOP的语言中已存在,PHP只是简单的封装了file/file_get_content等函数,使用起来方便,所以PHPer 们更少的在意stream以及整个底层的操作。

当我们使用一个完整的框架(如:drupal框架),drupal又更加完善了PHP中stream的概念和使用方式,使其更加OO,更加易用。

注意:PHP本身是支持StreamWrapper的,Drupal只是对其进行完善,因此PHP的函数,如move、 fopen、move_uploaded_file等函数是直接可以用scheme的形式访问(类似php://的形式),在PHP中增加一个 streamwrapper需要注册一个,需要调用stream_wrapper_register函数。

详情参考: http://php.net/..class.streamwrapper.php

Stream是什么?

Stream其实是一个抽象的概念,类似于传输层,位于文件系统的下层。跟Stream相连的就是存储,也就是Stream相当于一传输线,一端连接存储,一端连接程序。


File的操作

文件的操作基本就是读写,读写的位置其实就是stream,一般情况下读写本地文件,我们认为也是一个stream,可以认为 LocalFileStream,读写网络文件(FTP、HTTP、S3、阿里OSS、NFF等)也是一种stream,这样看来,文件的操作API其实应该是一个抽象的函数,而不是一个具体的函数。

用数据库作为类比,数据的open、prepare、update、execute、close就是有一个抽象的类,后端用什么数据库,就有对应的实现,参考下面的图片:


db-abstract-layer-files

程序调用数据库的抽象接口,该接口根据数据库的url,按照不同的scheme返回不同的数据库操作类,完成对数据库的操作。

因此文件的操作,我们用数据库操作做对比,也可以用下图来表示:


file-abstract-layer

通过上图,我们就可以理解,其实对文件的操作就是对流的操作,不同的流对应不同的存储介质,只是默认情况下,我们认为流就是本地文件,但是随着存储的日益复杂和云的兴起,对文件的操作已不能简单的理解为对本地文件的操作,而应该是对流(Stream)的操作。

因此,在其他语言里面stream是一个基类,根据不同的存储介质,stream有不同的实现,比如C#中的stream的集成关系如下,通过OO的方式,更好的理解stream的概念。


C# Stream

Drupal中File API和Stream Wrapper

一图顶万言,综合上面的理解,我们做了下面这张关系图,虽然不一定准确,但是可以帮助我们理解Drupal中file和stream wrapper的关系。


drupal file system and  streamwrapper

Drupal的stream wrapper只是一个接口,可以实现任意的自定义stream wrapper。

Drupal的第三方stream wrapper:

Remote stream wrapper(http://、https://、feeds://)

https://www.drupal.org/project/remote_stream_wrapper

System stream wrapper (module://、theme://、profile://、library://)

https://www.drupal.org/project/system_stream_wrapper

因此,标准化的File操作,需要传进去一个带有scheme的path,在PHP中,默认的不带scheme就是本地文件。在Drupal中,默认的scheme是public,也是是本地文件的public目录。

StorageAPI 模块

Drupal中也许对上面的逻辑坐得不够完善,或许抽象层不是很完美,因此storageAPI模块出现了,它扩展的标准的Drupal文件操作,即使你对Drupal的file和stream不懂,装上这个模块,加上对应的service就能实现上图对云文件的操作。 如Amazon S3、Ftp、database等。

(笔者看来,StorageAPI就是对上面图中文件访问结构图中逻辑的实现和完善)

当然这个模块也有缺陷,那就是跟某些第三方模块的兼容的问题,并不是所有模块都能良好的兼容storage api模块,这个也是drupal第三方模块的同病。

注意,要启用drupal文件对storageAPI的支持,需要启用Core Bridge 模块。

StorageAPI模块参考 https://drupal.org/project/storage_api

Storage api stream wrapper :https://www.drupal.org/project/storage_api_stream_wrapper

后记

回顾第一段,PHP内部支持StreamWrapper,在Drupal中,对PHP的StreamWrapper进行了扩展,主要的Interface是:DrupalStreamWrapperInterface

Drupal本身通过这个Interface实现了DrupalLocalStreamWrapper,第三方模块实现了很多,如下:

HPCloud: HPCloudDrupalStreamWrapper

Storage API: StorageApiStreamWrapper

Storage Core Bridge: DrupalStorageStreamWrapper


[!--infotagslink--]

相关文章

  • PHP+Ajax手机发红包的程序例子

    PHP+Ajax有许多的功能都会用到它小编今天就有使用PHP+Ajax实现的一个微信登录功能了,下面我们来看一个PHP+Ajax手机发红包的程序例子,具体如下所示。 PHP发红包基本...2016-11-25
  • C#微信开发之发送模板消息

    这篇文章主要为大家详细介绍了C#微信开发之发送模板消息的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • 超简洁java实现双色球若干注随机号码生成(实例代码)

    这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
  • iOS新版微信底部返回横条问题的解决

    这篇文章主要介绍了iOS新版微信底部返回横条问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-30
  • Java生成随机姓名、性别和年龄的实现示例

    这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
  • 基于C#实现微信支付宝扫码支付功能

    为公司系统业务需要,这几天了解了一下微信和支付宝扫码支付的接口,并用c#实现了微信和支付宝扫码支付的功能。需要的朋友跟随小编一起看看吧...2020-06-25
  • Python爬取微信小程序通用方法代码实例详解

    这篇文章主要介绍了Python爬取微信小程序通用方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-29
  • C#实现的微信网页授权操作逻辑封装示例

    这篇文章主要介绍了C#实现的微信网页授权操作逻辑封装,分析了微信网页授权操作的原理、步骤并给出了C#实现的网页授权操作逻辑封装类,需要的朋友可以参考下...2020-06-25
  • C++随机点名生成器实例代码(老师们的福音!)

    这篇文章主要给大家介绍了关于C++随机点名生成器的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • iOS新版微信底部工具栏遮挡问题完美解决

    这篇文章主要介绍了iOS新版微信底部工具栏遮挡问题完美解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-30
  • C#图像识别 微信跳一跳机器人

    这篇文章主要为大家详细介绍了C#图像识别,微信跳一跳机器人,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • 基于JavaScript代码实现微信扫一扫下载APP

    有很多人在做微信的扫一扫下载。但是在微信更新之后微信将该功能给禁止掉了,也不能说是全面禁止吧,因为腾讯、微信是一家嘛,通过应用宝审核的应用好像还是可以通过扫一扫直接下载的,下面通过本篇文章给大家介绍微信扫一扫下载app的代码片段,感兴趣的朋友一起看看吧...2016-01-02
  • 简单用VBS调用企业微信机器人发定时消息的方法

    这篇文章主要介绍了简单用VBS调用企业微信机器人发定时消息的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • python实现企业微信定时发送文本消息的实例代码

    这篇文章主要介绍了python实现企业微信定时发送文本消息的实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-11-25
  • HTML5实现微信拍摄上传照片功能

    这篇文章主要介绍了HTML5实现微信拍摄上传照片功能,实现HTML5 Canvas手机拍摄,本地压缩上传图片时遇到问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2017-04-27
  • JS实现的随机排序功能算法示例

    这篇文章主要介绍了JS实现的随机排序功能算法,结合具体实例形式分析了javascript常用的排序算法实现技巧,需要的朋友可以参考下...2017-06-15
  • 如何使用原生Js实现随机点名详解

    这篇文章主要给大家介绍了关于如何使用原生Js实现随机点名的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-06
  • 解决微信授权成功后点击按返回键出现空白页和报错的问题

    这篇文章主要介绍了解决微信授权成功后点击按返回键出现空白页和报错的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-08
  • 微信为何被“专利流氓”起诉?腾讯太有钱

    六月才刚刚过半,就已经相继有中兴、华为被美国起诉,此次微信也未能幸免,被美国一家叫Uniloc的公司起诉,理由是微信的语音群聊、视频聊天等功能侵犯其两项与电话会议技术相关的专利,该公司要求微信立即中止这些功能。...2016-07-04
  • 原生JS实现微信通讯录

    这篇文章主要为大家详细介绍了原生JS实现微信通讯录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-19