2018-03-03 15:30:11 JavaNotes 阅读数 1017
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27842 人正在学习 去看看 秦子恒
https://github.com/Wechat-Group
2017-05-23 15:18:21 RE_PHPzjw 阅读数 7106
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27842 人正在学习 去看看 秦子恒

目录 List

1. 那一抹淡淡的忧伤—–微信开发基础
2. 用纯js是不可能用纯js了,这辈子都不用纯js了 —– 微信JSSDK开发以及问题解答
3. 要你命3000 —— 微信支付开发系列问题解决

导语

微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。
通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验。
本文重点讲最新的JSSDK版本1.2,关于1.2版本的说明可以参考这里
尤其注意从1.2版本开始微信针对IOS系统WKWebview内核做出了重大改变,所以广大开发者当以最新JSSDK1.2版本为开发源码,否则可能造成IOS部分功能无效


开发前准备

步骤一:绑定域名

先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
备注:登录后可在“开发者中心”查看对应的接口权限。


步骤二:引入JS文件
在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.2.0.js


步骤三:通过config接口注入权限验证配置

wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: ”, // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: ”, // 必填,生成签名的随机串
signature: ”,// 必填,签名,见附录1
jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 });

直接用代码演示

//加载微信JSSDK config
wx.config({
        debug: false,
        appId: 'APPID',
        timestamp: time,
        nonceStr: 'NONCESTR',
        signature: 'SIGNATURE',
        jsApiList: [
            'checkJsApi',
            'onMenuShareTimeline',
            'onMenuShareAppMessage',
            'onMenuShareQQ',
            'onMenuShareWeibo',
            'onMenuShareQZone',
            'hideMenuItems',
            'showMenuItems',
            'hideAllNonBaseMenuItem',
            'showAllNonBaseMenuItem',
            'translateVoice',
            'startRecord',
            'stopRecord',
            'onVoiceRecordEnd',
            'playVoice',
            'onVoicePlayEnd',
            'pauseVoice',
            'stopVoice',
            'uploadVoice',
            'downloadVoice',
            'chooseImage',
            'previewImage',
            'uploadImage',
            'downloadImage',
            'getNetworkType',
            'openLocation',
            'getLocation',
            'hideOptionMenu',
            'showOptionMenu',
            'closeWindow',
            'scanQRCode',
            'chooseWXPay',
            'openProductSpecificView',
            'addCard',
            'chooseCard',
            'openCard',
        ]
    });
    //JSSDK错误报告
    wx.error(function(res){
        console.log(location.href.split('#')[0]);
    });

config里面所涉及到的参数我们通过JSSDK官方demo来提供数据,我对官方的demo进行了再次封装,直接在这里贴出来:

class Jssdk{
    private $appId;
    private $appSecret;

    public function __construct($appId, $appSecret) {
        $this->appId = $appId;
        $this->appSecret = $appSecret;
    }

    public function getSignPackage() {
        $jsapiTicket = $this->getJsApiTicket();

        // 注意 URL 一定要动态获取,不能 hardcode.
        $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
        $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

        $timestamp = time();
        $nonceStr = $this->createNonceStr();

        // 这里参数的顺序要按照 key 值 ASCII 码升序排序
        $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";

        $signature = sha1($string);

        $signPackage = array(
            "appId"     => $this->appId,
            "nonceStr"  => $nonceStr,
            "timestamp" => $timestamp,
            "url"       => $url,
            "signature" => $signature,
            "rawString" => $string
        );
        return $signPackage;
    }

    private function createNonceStr($length = 16) {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }

    private function getJsApiTicket() {
        // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
        $data = json_decode($this->get_php_file("jsapi_ticket.php"));
        if ($data->expire_time < time()) {
            $accessToken = $this->getAccessToken();
            // 如果是企业号用以下 URL 获取 ticket
            // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
            $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
            $res = json_decode($this->httpGet($url));
            $ticket = $res->ticket;
            if ($ticket) {
                $data->expire_time = time() + 7000;
                $data->jsapi_ticket = $ticket;
                $this->set_php_file("jsapi_ticket.php", json_encode($data));
            }
        } else {
            $ticket = $data->jsapi_ticket;
        }

        return $ticket;
    }

    private function getAccessToken() {
        // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
        $data = json_decode($this->get_php_file("access_token.php"));
        if ($data->expire_time < time()) {
            // 如果是企业号用以下URL获取access_token
            // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
            $res = json_decode($this->httpGet($url));
            $access_token = $res->access_token;
            if ($access_token) {
                $data->expire_time = time() + 7000;
                $data->access_token = $access_token;
                $this->set_php_file("access_token.php", json_encode($data));
            }
        } else {
            $access_token = $data->access_token;
        }
        return $access_token;
    }

    private function httpGet($url) {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 500);
        // 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
        // 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
        curl_setopt($curl, CURLOPT_URL, $url);

        $res = curl_exec($curl);
        curl_close($curl);

        return $res;
    }

    private function get_php_file($filename) {
        return trim(substr(file_get_contents($filename), 15));
    }
    private function set_php_file($filename, $content) {
        $fp = fopen($filename, "w");
        fwrite($fp, "<?php exit();?>" . $content);
        fclose($fp);
    }
}

务必先拿到数据后注册给JSconfig,否则微信JSSDK是无效的

等你一切准备得当的时候请打开网页调试里的console来查看效果

正确调用的情况:
这里写图片描述

到这里所有的准备工作就完成了


图片选择

调用JSSDK的图片接口

wx.chooseImage({
            count: 1,
            success: function (res) {
                //选择图片成功后
                images.localId = res.localIds;//安卓可以直接使用localIds 预览图片
                if(res.localIds.indexOf("wxlocalresource") != -1){
                    res.localIds = res.localIds.replace("wxlocalresource", "wxLocalResource");
                }
              )};  
               //以下的适配IOS
               //先使用阅览接口(适配IOSWKWebview版本)
                    wx.getLocalImgData({
                        localId: images.localId[i], // 图片的localID
                        success: function (res) {
                            var localData = res.localData; // localData是图片的base64数据,可以用img标签显示
                            $("#chooseImage").parent().before("<li class='upload_action'><img src='"+localData+"'/></li>");
                        }

                    });

图片上传

直接采用递归方法来上传多张图片

function upload() {
    wx.uploadImage({
                        localId: images.localId[i].toString(),
                        isShowProgressTips: 1, // 默认为1,显示进度提示
                        success: function (res) {
                            i++;
                            var media_id = res.serverId;

                            images.serverId.push(res.serverId);//上传到了服务器的ID

                            if (i < length) {
                                upload();
                            }
                        },
                        fail: function (res) {
                            alert(JSON.stringify(res));
                        }
                    });

}

将上传到服务器的图片下载到本地项目

public function getmedia(){
        $media_id = get.sevrid;//前端返回的上传后的媒体id
        $weixin = new Weixinpay(); //实例化微信类
        $access_token = $weixin->getToken(); //获取token

        $url = "https://api.weixin.qq.com/cgi-bin/media/get?access_token=".$access_token."&media_id=".$media_id;
        //获取微信“获取临时素材”接口返回来的内容(即刚上传的图片)
        $a = file_get_contents($url);
        //echo $a;
        $filename = date('YmdHis').rand(1000,9999).'.jpg';
        //以读写方式打开一个文件,若没有,则自动创建
        $resource = fopen($_SERVER["DOCUMENT_ROOT"].'/Uploads/User_img/'.$filename, 'w+');
        //将图片内容写入上述新建的文件
        fwrite($resource, $a);
        //关闭资源
        fclose($resource);
        echo '/Car/Common/Uploads/User_img/'.$filename;
    }

通过以上方法我们能达到 用户用微信自带的上传图片系统上传到我们自己服务器上


完整代码

var images = {
        localId: [],
        serverId: []
    };
    choose.onclick = function(){
        wx.chooseImage({
            count: 1,
            success: function (res) {
                //选择图片成功后
                images.localId = res.localIds;
                if(res.localIds.indexOf("wxlocalresource") != -1){
                    res.localIds = res.localIds.replace("wxlocalresource", "wxLocalResource");
                }
                var i = 0, length = images.localId.length;

                function upload() {
                    //先使用阅览接口(适配IOSWKWebview版本)
                    wx.getLocalImgData({
                        localId: images.localId[i], // 图片的localID
                        success: function (res) {
                            var localData = res.localData; // localData是图片的base64数据,可以用img标签显示
                            $("#chooseImage").parent().before("<li class='upload_action'><img src='"+localData+"'/></li>");
                        }

                    });
                    wx.uploadImage({
                        localId: images.localId[i].toString(),
                        isShowProgressTips: 1, // 默认为1,显示进度提示
                        success: function (res) {
                            i++;
                            var media_id = res.serverId;

                            images.serverId.push(res.serverId);
                            $.ajax({
                                url:'getmedia.php',
                                data:{'mid':res.serverId.toString()},
                                type:'get',
                                success:function(res){
                                    $("input[name='qu_img']").val(res);
                                    $("#chooseImage").hide();
                                }

                            });
                            if (i < length) {
                                upload();
                            }
                        },
                        fail: function (res) {
                            alert(JSON.stringify(res));
                        }
                    });

                }
                upload();
            }
        });

    }

演示

这里写图片描述

讨论和询问可以加QQ

1577452412

2018-09-12 17:05:37 wtdask 阅读数 5180
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27842 人正在学习 去看看 秦子恒

Good days give you happiness and bad days give you experience.
顺境带来快乐,逆境带来成长。


云开发 quickstart

这是云开发的快速启动指引,其中演示了如何上手使用云开发的三大基础能力:

  • 数据库:一个既可在小程序前端操作,也能在云函数中读写的 JSON 文档型数据库
  • 文件存储:在小程序前端直接上传/下载云端文件,在云开发控制台可视化管理
  • 云函数:在云端运行的代码,微信私有协议天然鉴权,开发者只需编写业务逻辑代码

参考文档

  • 云开发文档

  • 先把微信开发工具更新至最新(1.02.1809111)

注意1:创建一个新项目,注意要在一个空文件夹目录下创建,有隐藏文件的文件夹也不可以。
注意2:云开发方式,需要appid,请准备好

  • 选择“建立云开发快速启动模版”进行新项目创建

这里写图片描述

这里写图片描述

目录结构如下:

cloudfunctions
    | - login

miniprogram
    | - images
           | - code-db-inc-dec.png
           | - code-db-onAdd.png
           | - code-db-onQuery.png
           | - code-db-onRemove.png
           | - code-func-sum.png
           | - console-entrance.png
           | - create-collection.png
    | - pages
           | - addFunction
                    | - addFunction.js
                    | - addFunction.json
                    | - addFunction.wxml
                    | - addFunction.wxss
           | - chooseLib
                    | - chooseLib.js
                    | - chooseLib.json
                    | - chooseLib.wxml
                    | - chooseLib.wsxx
           | - databaseGuide
                    | - databaseGuide.js
                    | - databaseGuide.json
                    | - databaseGuide.wxml
                    | - databaseGuide.wxss
           | - deployFunctions
                    | - deployFunctions.js
                    | - deployFunctions.json
                    | - deployFunctions.wxml
                    | - deployFunctions.wxss
           | - index
                    | - index.js
                    | - index.wxml
                    | - index.wxss
                    | - user-unlogin.png
           | - storageConsole
                    | - storageConsole.js
                    | - storageConsole.json
                    | - storageConsole.wxml
                    | - storageConsole.wxss
           | - userConsole
                    | - userConsole.js
                    | - userConsole.json
                    | - userConsole.wxml
                    | - userConsole.wxss
    | - style
           | - guide.wxss
    | - app.js
    | - app.json
    | - app.wxss

README.md
project.config.json
  • 创建服务环境名称,点击云开发

这里写图片描述

  • 一个账户可以创建两个环境,一个作为开发环境,一个作为生产环境

如下图所示这是新建项目中一个简单的获取用户openId的云函数示例

这里写图片描述

  • cloudfunctions路径下的login文件夹上点击右键,选择创建并部署

这里写图片描述

部署成功后,弹出如下界面

这里写图片描述

  • 在云开发界面的左上角找到“环境ID”并复制

这里写图片描述

miniprogram目录下的app.js配置环境ID

//app.js
App({
  onLaunch: function () {

    if (!wx.cloud) {
      console.error('请使用 2.2.3 或以上的基础库以使用云能力')
    } else {
      wx.cloud.init({
        env:'你的环境ID',
        traceUser: true,
      })
    }
    this.globalData = {}
  }
})

保存编译,即可Log你的openId

这里写图片描述

打开云开发控制台,点击云函数->login函数->右上角的测试按钮

把我们在上面获取到的openId修改复制上去,点击运行测试显示测试成功。

更新目录

2017-06-07 22:31:15 ke7in1314 阅读数 1355
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27842 人正在学习 去看看 秦子恒

    前不久做了一个微信公众号项目,有用到JSSDK接口,今晚正好有空,就开始动手整理。如何获得accesstoken和jsapitiket以及生成签名就不细说了,大家看接口文档,有不明白的地方可以给我留言。本文主要介绍了如何去使用JSSDK的部分接口,包括选择图片、上传图片、下载图片、获取地理位置、调用微信扫一扫,其他接口以后补充,代码我贴出来了,测试通过。

     接口文档官方地址:https://mp.weixin.qq.com/wiki

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>

	<head>
		<title>接入微信JSSDK</title>
		<base href="<%=basePath%>">
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" name="viewport" />

		<head>
			<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
			<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
			<script type="text/javascript">
			
		
				$(function() {
					var appId = '${sign.appId}';
					var nonceStr = '${sign.nonceStr}';
					var timestamp = '${sign.timestamp}';
					var signature = '${sign.signature}';
					wx.config({
						debug: true,
						appId: appId,
						timestamp: timestamp,
						nonceStr: nonceStr,
						signature: signature,
						jsApiList: [
							'checkJsApi',
							'chooseImage',
							'uploadImage',
							'downloadImage',
							'getLocation',
							'scanQRCode'
						]
					});
					var images = {
						localId: [],
						serverId: [],
						downloadId: []
					};

					//选择图片
					$("#chooseImage").bind("click", function() {
						wx.chooseImage({
							count: 9, // 默认9,最多可选9张图片
							sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
							sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
							success: function(res) {
								images.localId = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
							}
						});
					});
					
					//上传图片
				    $("#uploadImage").bind("click", function() {
						var i = 0,
							len = images.localId.length;
						if(len == 0) {
							alert('请先使用 chooseImage 接口选择图片', null);
							return;
						}
						// if(images.localId.length > 1) {
						//    alert('目前仅支持单张图片上传,请重新上传');
						//   images.localId = [];
						//   return false;
						//  }
						function wxUpload() {
							wx.uploadImage({
								localId: images.localId[i], // 需要上传的图片的本地ID,由chooseImage接口获得
								isShowProgressTips: 9, // 默认为1,显示进度提示
								success: function(res) {
									i++;
									alert('已上传:' + i + '/' + len);
									//将上传成功后的serverId保存到serverid
									images.serverId.push(res.serverId);
									//上传成功,下载到本地
									wxImgCallback(res.serverId);
									if(i < len) {
										wxUpload();
									}
								},
								fail: function(res) {
									alert('上传失败');
								}
							});
						}
						wxUpload();
					});
				    
					//下载图片
				    $("#downloadImage").bind("click", function() {
						var i = 0,
							len = images.serverId.length;
						if(len == 0) {
							alert('请先使用 chooseImage 接口选择图片', null);
							return;
						}

						function wxDownload() {
							wx.downloadImage({
								serverId: images.serverId[i], // 需要下载的图片的服务器端ID,由uploadImage接口获得
								isShowProgressTips: 1, // 默认为1,显示进度提示
								success: function(res) {
									i++;
									alert('已下载:' + i + '/' + len);
									images.downloadId.push(res.localId);
									if(i < len) {
										wxDownload();
									}
								}
							});
						}
						wxDownload();
					});

					//获取地理位置
		            $("#openLocation").bind("click", function() {
						wx.getLocation({
							success: function(res) {
								alert(JSON.stringify(res));
							},
							cancel: function(res) {
								alert('用户拒绝授权获取地理位置');
							},
							fail: function(res) {
								alert(JSON.stringify(res));
							}
						});
					});
					
					//调用扫一扫
					$("#scanQRCode").bind("click", function() {
						wx.scanQRCode({
						    needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
						    scanType: ["qrCode","barCode"], // 可以指定扫二维码还是一维码,默认二者都有
						    success: function (res) {
							    var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
							    alert(result);
							}
						});
					});
				});

				function wxImgCallback(serverId) {
					$.ajax({
						type: "get",
						url: "${base}/mall/download",
						contentType: "application/json;charset=utf-8",
						data: "serverId=" + serverId,
						success: function(data) {
							if(data == 1){
								alert("下载成功");
							}
						},
						error: function(data) {
							alert("失败");
						}
					});

				}

				wx.error(function(res) {
					alert("出错了:" + res.errMsg);
				});
			</script>
		</head>

		<body>
			<input type="button" id="chooseImage" value="选择图片" /> <br>
			<input type="button" id="uploadImage" value="上传图片" /> <br>
			<input type="button" id="downloadImage" value="下载图片" /> <br>
			<input type="button" id="openLocation" value="查看位置" /> <br>
			<input type="button" id="scanQRCode" value="扫一扫" /> <br>
		</body>
</


      


(转载注明出处,原文地址:http://blog.csdn.net/ke7in1314/article/details/72904491



       

 

   

2018-07-30 14:32:31 matchvs 阅读数 5562
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27842 人正在学习 去看看 秦子恒

游戏说明:

这是一款多人在线的斗地主棋牌游戏,拥有随机匹配功能,有三人同时匹配即可开始游戏。游戏支持微信约战,玩家通过在微信上发送邀请信息给微信好友,好友点击信息即可进入游戏。 (PS:需要自己配置自己的微信APPID,可以上传测试版体验。)

引擎开发工具:egret5.2.0 +Matchvs SDK  v3.7.3.0

开发语言:TypeScript

话不多说,一行源码胜千言。

源码地址:https://github.com/matchvs/Poke

 

没有更多推荐了,返回首页