PHP版微信红包API接口程序

 更新时间:2016年11月25日 17:18  点击:2121
对于 微信红包我相信今年过年时各位朋友都有知道吧,这个微信红包相当的火爆了,下面我们来给各位介绍一个PHP版微信红包API接口程序了,我们可以基于这个接口也实现开发第三方红包功能。


根据微信高级红包接口,开发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');
}

php二维数组多元素排序小编介绍过很多了,只是今年看到这个例子有一点区别了所以小编为各位整理了一下,希望这个排序算法能够帮助到各位。

写个二维数组的多元素排序,多元素排序类似sql中的order by sort,date,下面代码考虑性能问题,只涉及2个元素进行排序。

代码区:

function multipleArraySort($old_arr,$arr1,$arr2){
//排序第一个元素
$old_arr = array_sort($old_arr,$arr1[0],$arr1[1]);
$temp_array = $new_temp_array = array();
foreach($old_arr as $k => $v){
$key_count = count($old_arr)-1;
//第一个元素数相等,放入临时数组
if($v[$arr1[0]] == $old_arr[$k-1][$arr1[0]] || empty($temp_array)){
$temp_array[$k] = $v;
}
if(($v[$arr1[0]] != $old_arr[$k-1][$arr1[0]] && !empty($temp_array)) || $key_count == $k){
//添加最新元素
$temp_array[$k] = $v;
//数组大于1时,进行排序处理
if(count($temp_array)>1){
if($key_count != $k){
//删除最后一个(与上一个不相等元素)
unset($temp_array[$k]);
}
//不是最后或者最后相同,进行排序
if($key_count != $k || $v[$arr1[0]] == $old_arr[$k-1][$arr1[0]]){
//排序第二个元素
$temp_array = array_sort($temp_array,$arr2[0],$arr2[1]);
}
//排序后把排序的数组,插入原数组排序前位置
$count = count($new_temp_array)==0 ? 0 : count($new_temp_array);
foreach($temp_array as $val_t){
$new_temp_array[$count] = $val_t;
$count++;
}
//写入新数组后清空原数组
$temp_array = array();
//添加最新元素
$temp_array[$k] = $v;
}
}
}
return $new_temp_array;
}
//根据数组元素排序
function array_sort($arr,$keys,$type='asc'){
$keysvalue = $new_array = array();
//获取元素值,生成新数组
foreach ($arr as $k=>$v){
$keysvalue[$k] = $v[$keys];
}
//排序,默认为正序
if($type == 'asc'){
asort($keysvalue);
}else{
arsort($keysvalue);
}
reset($keysvalue);
$count_s = 0;
//恢复键值
foreach ($keysvalue as $k=>$v){
$new_array[$count_s] = $arr[$k];
$count_s++;
}
return $new_array;
}
调用方法:

$old_arr = array(
array('id'=>1,'sort'=>1,'date'=>'1405648791'),
array('id'=>2,'sort'=>1,'date'=>'1405649791'),
array('id'=>3,'sort'=>2,'date'=>'1405647791'),
);
$arr1 = array('sort','desc');
$arr2 = array('date','desc');
$newArr = multipleArraySort($old_arr,$arr1,$arr2);
var_dump($newArr);
打印结果:

重定向对于我们来讲就是301了,但在php中用重定向会使用到header函数了,下文我们介绍的主要是一些状态代码与使用方法的例子。

重定向是一个看似简单,实际很复杂的问题。HTTP状态码一共才五个系列(1XX,2XX,3XX,4XX,5XX),而重定向状态码被单独作为一个系列(3XX)存在,足以说明它的重要性,但是很多人认为知道301/302的区别就算熟悉重定向了,这实在是一大谬误。本文主要介绍一下303/307。

为了方便测试,首先熟悉一下如何使用curl命令得到响应头:

-I/–head
(HTTP/FTP/FILE) Fetch the HTTP-header only! HTTP-servers feature the command HEAD which this uses to get nothing but the header of a document. When used on a FTP or FILE file, curl displays the file size and last modification time only.

例子命令:curl -I http://www.google.com/

通常PHP里的重定向是这样的:

header('Location: http://localhost/');
exit();

通过curl命令访问如上的代码,我们将得到如下响应头:

HTTP/1.1 302 Found
Location: http://localhost/

如上的重定向代码在编程里很常用,比如说添加文章成功后,跳转回列表页,不过这里的重定向状态码302却是值得商榷的。

这还得从头说起,在HTTP1.0的时代,那时候302的名字还是“Moved Temporarily”,但在实际使用上,302往往包含了两方面的意思(也就是后来的303/307),为了消除可能的混淆,在HTTP1.1中,302被重命名为“Found”,并新加了303(See Other)和307(Temporary Redirect),至于PHP之所以在重定向时缺省使用302状态码是为了兼容的目的,所以不到不得已(有时候,客户端是HTTP1.0的,只理解302),不应该使用302。

303和307都把重定向的URI置于Location头中,他们的区别在于:

303:对于POST请求,它表示请求已经被处理,客户端可以接着使用GET方法去请求Location里的URI。
307:对于POST请求,表示请求还没有被处理,客户端应该向Location里的URI重新发起POST请求。

下面看看PHP如何发送非302的重定向,以303为例:

// 第一种方法
header('Location: http://localhost/', true, 303);
 
// 第二种方法
header('HTTP/1.1 303 See Other');
header('Location: http://localhost/');
使用curl命令,你就会看到如下响应头:

HTTP/1.1 303 See Other
Location: http://localhost/

总结,本文说的主要是303/307之间的关系。之所以明确区分是为了让状态码本身能够准确的表达响应的含义,从而尽可能的避免对重定向的滥用。

phpexcel是php中专业来操作excel表格的一个php插件了,下文我们就来看看phpexcel读取excel表格时间的例子,希望下文能够帮助到各位。


编辑通过excel表格修改了大批的产品价格和促销时间,让我们技术批量导入到线上数据库。

这样对于我们来说是一件在简单不过的事情了,保护phpexcel导表利器,瞬间解决问题。

可是,进入数据库一看:蒙了,导入的时间格式有问题,展示的不是时间,是数字,郁闷中。

然后通过php输出,果然不是时间的格式。

百度一遍发现,phpexcel里面提供了这样的方法getFormattedValue()来读出时间的,将getValue()换成
getFormattedValue();

$abc = $currentSheet->getCell ( ‘A’ . $currentRow )->getFormattedValue ();

这样就可以顺利的读出excel表里的时间,重新更新数据库,OK。

下面看个例子

error_reporting(E_ALL);
date_default_timezone_set('Asia/shanghai');
/** PHPExcel_IOFactory */
require_once '../Classes/PHPExcel/IOFactory.php';
$inputFileName = '6081076641077444758.xls';
$objReader = new PHPExcel_Reader_Excel5();
$objPHPExcel = $objReader->load($inputFileName);
$sheet = $objPHPExcel->getSheet(0);
$highestRow = $sheet->getHighestRow(); // 取得总行数
$highestColumn = $sheet->getHighestColumn(); // 取得总列数

$tempArray = array();
for($j=2;$j<=$highestRow;$j++){
   for($k='A';$k<=$highestColumn;$k++){
    if($k=='M'||$k=='O') //M列和O列是时间
  $tempArray[] = excelTime($objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue());
 else
  $tempArray[] = $objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue();
 }
 print_r($tempArray);
 unset($tempArray);
}


function excelTime($date, $time = false) {
 if(function_exists('GregorianToJD')){
  if (is_numeric( $date )) {
  $jd = GregorianToJD( 1, 1, 1970 );
  $gregorian = JDToGregorian( $jd + intval ( $date ) - 25569 );
  $date = explode( '/', $gregorian );
  $date_str = str_pad( $date [2], 4, '0', STR_PAD_LEFT )
  ."-". str_pad( $date [0], 2, '0', STR_PAD_LEFT )
  ."-". str_pad( $date [1], 2, '0', STR_PAD_LEFT )
  . ($time ? " 00:00:00" : '');
  return $date_str;
  }
 }else{
  $date=$date>25568?$date+1:25569;
  /*There was a bug if Converting date before 1-1-1970 (tstamp 0)*/
  $ofs=(70 * 365 + 17+2) * 86400;
  $date = date("Y-m-d",($date * 86400) - $ofs).($time ? " 00:00:00" : '');
 }
  return $date;
}

最后在把网站编辑器由以前的fck改成UEDITOR编辑器了,但是发现UEDITOR编辑器上传图片是自动提取的,但是图片没有水印功能,下面小编和各位一起来看看。


UEditor编辑器没有上传图片加水印的功能,需要进行二次开发,本例是在PHPCMS系统中对百度编辑器进行二次开发,添加上传图片加水印功能。


首先打开UEditor编辑器文件目录的php文件夹,打开Uploader.class.php,把PHPCMS添加水印的方法复制过来,加到这个类所有成员方法最后面,然后进行修改如下:


//图片加水印
public function watermark($source, $target = '', $w_pos = '', $w_img = '', $w_text = '99danji',$w_font = 8, $w_color = '#ff0000') {
    $this->w_img = 'watermark.png';
    $this->w_pos = 9;
    $this->w_minwidth = 400;
    $this->w_minheight = 200;
    $this->w_quality = 80;
    $this->w_pct = 85;
 
    $w_pos = $w_pos ? $w_pos : $this->w_pos;
    $w_img = $w_img ? $w_img : $this->w_img;
    //if(!$this->watermark_enable || !$this->check($source)) return false;
    if(!$target) $target = $source;
    //$w_img = PHPCMS_PATH.$w_img;
    //define('WWW_PATH', dirname(dirname(dirname(__FILE__)));
    $w_img = '../../../images/water/'.$w_img;
    $source_info = getimagesize($source);
    $source_w    = $source_info[0];
    $source_h    = $source_info[1];
    //if($source_w < $this->w_minwidth || $source_h < $this->w_minheight) return false;
    switch($source_info[2]) {
        case 1 :
            $source_img = imagecreatefromgif($source);
            break;
        case 2 :
            $source_img = imagecreatefromjpeg($source);
            break;
        case 3 :
            $source_img = imagecreatefrompng($source);
            break;
        default :
            return false;
    }
    if(!empty($w_img) && file_exists($w_img)) {
        $ifwaterimage = 1;
        $water_info   = getimagesize($w_img);
        $width        = $water_info[0];
        $height       = $water_info[1];
        switch($water_info[2]) {
            case 1 :
                $water_img = imagecreatefromgif($w_img);
                break;
            case 2 :
                $water_img = imagecreatefromjpeg($w_img);
                break;
            case 3 :
                $water_img = imagecreatefrompng($w_img);
                break;
            default :
                return;
        }
    } else {       
        $ifwaterimage = 0;
        $temp = imagettfbbox(ceil($w_font*2.5), 0, PC_PATH.'libs/data/font/elephant.ttf', $w_text);
        $width = $temp[2] - $temp[6];
        $height = $temp[3] - $temp[7];
        unset($temp);
    }
    switch($w_pos) {
        case 1:
            $wx = 5;
            $wy = 5;
            break;
        case 2:
            $wx = ($source_w - $width) / 2;
            $wy = 0;
            break;
        case 3:
            $wx = $source_w - $width;
            $wy = 0;
            break;
        case 4:
            $wx = 0;
            $wy = ($source_h - $height) / 2;
            break;
        case 5:
            $wx = ($source_w - $width) / 2;
            $wy = ($source_h - $height) / 2;
            break;
        case 6:
            $wx = $source_w - $width;
            $wy = ($source_h - $height) / 2;
            break;
        case 7:
            $wx = 0;
            $wy = $source_h - $height;
            break;
        case 8:
            $wx = ($source_w - $width) / 2;
            $wy = $source_h - $height;
            break;
        case 9:
            $wx = $source_w - $width;
            $wy = $source_h - $height;
            break;
        case 10:
            $wx = rand(0,($source_w - $width));
            $wy = rand(0,($source_h - $height));
            break;             
        default:
            $wx = rand(0,($source_w - $width));
            $wy = rand(0,($source_h - $height));
            break;
    }
    if($ifwaterimage) {
        if($water_info[2] == 3) {
            imagecopy($source_img, $water_img, $wx, $wy, 0, 0, $width, $height);
        } else {
            imagecopymerge($source_img, $water_img, $wx, $wy, 0, 0, $width, $height, $this->w_pct);
        }
    } else {
        if(!empty($w_color) && (strlen($w_color)==7)) {
            $r = hexdec(substr($w_color,1,2));
            $g = hexdec(substr($w_color,3,2));
            $b = hexdec(substr($w_color,5));
        } else {
            return;
        }
        imagestring($source_img,$w_font,$wx,$wy,$w_text,imagecolorallocate($source_img,$r,$g,$b));
    }
   
    switch($source_info[2]) {
        case 1 :
            imagegif($source_img, $target);
            break;
        case 2 :
            imagejpeg($source_img, $target, $this->w_quality);
            break;
        case 3 :
            imagepng($source_img, $target);
            break;
        default :
            return;
    }
 
    if(isset($water_info)) {
        unset($water_info);
    }
    if(isset($water_img)) {
        imagedestroy($water_img);
    }
    unset($source_info);
    imagedestroy($source_img);
    return true;
}
 
public function check($image) {
    return extension_loaded('gd') && preg_match("/\.(jpg|jpeg|gif|png)/i", $image, $m) && file_exists($image) && function_exists('imagecreatefrom'.($m[1] == 'jpg' ? 'jpeg' : $m[1]));
}
对比我修改的部分,www.111cn.net由于phpcms水印可以在后台管理设置,phpcms自带的水印方法通过读取配置文件获取路径,和读取数据库设置获取参数设置,那么这些地方需要手动进行设置。

对了,在upFile方法还要添加一段函数:

if ($this->watermark) {
    $this->watermark($this->filePath,$this->filePath);
}

然后打开UEditor百度编辑器php目录下的action_upload.php文件,加上是否添加水印的参数:

/* 上传配置 */
$base64 = "upload";
switch (htmlspecialchars($_GET['action'])) {
    case 'uploadimage':
        $config = array(
            "pathFormat" => $CONFIG['imagePathFormat'],
            "maxSize" => $CONFIG['imageMaxSize'],
            "allowFiles" => $CONFIG['imageAllowFiles']
        );
        $fieldName = $CONFIG['imageFieldName'];
        $watermark = true;
        break;
然后在后面还有一句要改成:

 

/* 生成上传实例对象并完成上传 */
$up = new Uploader($fieldName, $config, $base64, $watermark);

这样就大功告成了,本文主要是提供思路和参考。

[!--infotagslink--]

相关文章

  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • c# 三种方法调用WebService接口

    这篇文章主要介绍了c# 三种方法调用WebService接口的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-07
  • 微信小程序 页面传值详解

    这篇文章主要介绍了微信小程序 页面传值详解的相关资料,需要的朋友可以参考下...2017-03-13
  • C#使用Process类调用外部exe程序

    本文通过两个示例讲解了一下Process类调用外部应用程序的基本用法,并简单讲解了StartInfo属性,有需要的朋友可以参考一下。...2020-06-25
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • C#微信开发之发送模板消息

    这篇文章主要为大家详细介绍了C#微信开发之发送模板消息的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • vue接口请求加密实例

    这篇文章主要介绍了vue接口请求加密实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-12
  • 微信小程序二维码生成工具 weapp-qrcode详解

    这篇文章主要介绍了微信小程序 二维码生成工具 weapp-qrcode详解,教大家如何在项目中引入weapp-qrcode.js文件,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下...2021-10-23
  • uniapp微信小程序:key失效的解决方法

    这篇文章主要介绍了uniapp微信小程序:key失效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-20
  • iOS新版微信底部返回横条问题的解决

    这篇文章主要介绍了iOS新版微信底部返回横条问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-30
  • 将c#编写的程序打包成应用程序的实现步骤分享(安装,卸载) 图文

    时常会写用c#一些程序,但如何将他们和photoshop一样的大型软件打成一个压缩包,以便于发布....2020-06-25
  • PHP常用的小程序代码段

    本文实例讲述了PHP常用的小程序代码段。分享给大家供大家参考,具体如下:1.计算两个时间的相差几天$startdate=strtotime("2009-12-09");$enddate=strtotime("2009-12-05");上面的php时间日期函数strtotime已经把字符串...2015-11-24
  • 微信小程序自定义tabbar组件

    这篇文章主要为大家详细介绍了微信小程序自定义tabbar组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-03-14
  • 微信小程序 网络请求(GET请求)详解

    这篇文章主要介绍了微信小程序 网络请求(GET请求)详解的相关资料,需要的朋友可以参考下...2016-11-22
  • 微信小程序如何获取图片宽度与高度

    这篇文章主要给大家介绍了关于微信小程序如何获取图片宽度与高度的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-10
  • 基于C#实现微信支付宝扫码支付功能

    为公司系统业务需要,这几天了解了一下微信和支付宝扫码支付的接口,并用c#实现了微信和支付宝扫码支付的功能。需要的朋友跟随小编一起看看吧...2020-06-25
  • 微信小程序(应用号)开发新闻客户端实例

    这篇文章主要介绍了微信小程序(应用号)开发新闻客户端实例的相关资料,需要的朋友可以参考下...2016-10-25
  • Python爬取微信小程序通用方法代码实例详解

    这篇文章主要介绍了Python爬取微信小程序通用方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-29
  • 微信小程序 页面跳转传递值几种方法详解

    这篇文章主要介绍了微信小程序 页面跳转传递值几种方法详解的相关资料,需要的朋友可以参考下...2017-01-16