2017-01-22 18:08:16 qq_35020783 阅读数 90
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

在微信的开发过程中,因为lighttp服务器与laravel框架所导致的几个坑:

1、微信开发的第一步是要在微信公众平台填写配置信息,其中一项就是填写服务器的URL,所有选项填写完毕后,提交并验证成功。在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息。但是,laravel框架需要csrf 的验证,所以你在开发者中心处设置的服务器地址,必须将其排除在外(不验证csrf),否者会接受不到微信服务器传递的数据。

2、ligttpd服务器的配置文件中有url.rewrite-once项,当需要加载一些静态文件是,需要在此项中加入相应的目录及文件拓展格式,否者你怎么都加载不了静态文件。

微信开发的网页授权接口,需要验证一个xxx.txt的文件,就会遇到上述的问题。

2019-02-14 17:06:00 choudi1950 阅读数 8
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

微信开发的学习最早接触是在2016年12月份,当时只是看了微信开发文档,因为当时忙着开发公司网站,时间不充裕,知道2018年11月份,公司需要开发微信第三方平台,我自己打算先笼统学习一下微信开发,因为自己没有服务器,所有微信开发的服务器配置,需要依赖新浪云的SAE,使用SAE免费的应用就可以简单学习微信开发demo了。下面是在SAE上简单微信开发的demo。基本步骤如下:

1现在SAE创建应用,点击SAE创建应用按钮,

2配置应用,这里写的二级域名和应用名称生成的地址将会作为微信开发者模式配置的URL

3创建应用版本号

4上传代码

源代码如下所示,主要实现消息回复,自定义菜单功能,注意这里的自定义菜单还没有添加菜单事件

<?php
/**
  * wechat php test
  */

//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
//$wechatObj->valid();
$wechatObj->definedItem();
$wechatObj->responseMsg();


class wechatCallbackapiTest
{
    public function valid()
    {
        $echoStr = $_GET["echostr"];

        //valid signature , option
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }

    public function responseMsg()
    {
        //get post data, May be due to the different environments
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

        //extract post data
        if (!empty($postStr)){
                
                $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $fromUsername = $postObj->FromUserName;
                $toUsername = $postObj->ToUserName;
                $keyword = trim($postObj->Content);
                $time = time();
                $textTpl = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[%s]]></MsgType>
                            <Content><![CDATA[%s]]></Content>
                            <FuncFlag>0</FuncFlag>
                            </xml>";             
                if(!empty( $keyword ))
                {
                    $msgType = "text";
                    $contentStr = "你好,恒本银河很高兴见到你!";
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                    echo $resultStr;
                }else{
                    echo "请输入点什么吧";
                }

        }else {
            echo "";
            exit;
        }
    }
        
    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];    
                
        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );
        
        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }
    
    public function http_curl($url,$type='get',$res='json',$arr=''){
        //1.初始化curl
        $ch = curl_init();
        //2.设置curl的参数
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        if($type == 'post'){
            curl_setopt($ch, CURLOPT_POST,1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $arr);
        }
        //3.采集
        $output = curl_exec($ch);
        //4.关闭
        curl_close($ch);
        if($res=='json'){
            if(curl_error($ch)){
                //请求失败,返回错误信息
                return curl_error($ch);
            }else{
                //请求成功,返回错误信息
                return json_decode($output,true);
            }
        }
    }
    
    public function definedItem(){
        header('content-type:text/html;charset=utf-8');
        echo $access_token = "14_0sPagiitC6VVSv-h9hZxQM2QXPrlbU3rit0tDRkf0NxqfnKr9t_fF-5o3d1mCfPrcZHIv8HQf8xWd4um8uj5FE2gyqMlKfbr5HrYShKERz7vegZiOOZkdP4aIqBW6ogMLthaw3bZHlIgCmk2OGNiAJAEWD";
        echo '<br />';
        $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token;
        $postArr = array(
            'button' => array(
                    array(
                        'name' => urlencode('菜单一'),
                        'type' => 'click',
                        'key' => 'item1',
                    ),//第一个一级菜单
                    array(
                        'name' => urlencode('菜单二'),
                        'sub_button' => array(
                            array(
                                'name' => urlencode('歌曲'),
                                'type' => 'click',
                                'key' => 'songs',
                            ),//第一个二级菜单
                            array(
                                'name' => urlencode('电影'),
                                'type' => 'view',
                                'url' => 'http://www.baidu.com',
                            ),//第二个二级菜单
                        ),
                    ),//第二个一级菜单
                    array(
                        'name' => urlencode('菜单三'),
                        'type' => 'view',
                        'url' => 'http://www.qq.com',
                    ),//第三个一级菜单
                ),
            );
        //echo '<hr />';
        //var_dump($postArr);
        //echo '<hr />';
        $postJson = urldecode(json_encode($postArr));
        $res = $this->http_curl($url,'post','json',$postJson);
        //echo '<hr />';
        //var_dump($res);
    }
    
    
}

?>

从代码可以看出需要先运行valid()函数对微信的token进行验证

这里可以用SAE的代码编辑器进行编辑

通过点击index.php右键出现URL访问选项获取微信服务器端配置URL

5在微信公众平台配置开发者模式

有时候验证token的时候可能会因为网速问题导致验证失败,可以多试几次验证,其它的功能可以在SAE上修改代码,添加新的功能,这里只是为了记住这几个基本步骤

 

 

转载于:https://my.oschina.net/u/3425920/blog/3010137

2019-03-18 11:02:41 johnhan9 阅读数 136
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

接入微信服务器是微信公众号开发的第一步,这个过程就相当于在我们自己的服务器与微信服务器之间打通了一条通道,有了这条通道,我们自己的服务器才能与微信的服务器进行交互,接入微信服务器主要为一下几个步骤:

1、填写服务器信息

点击微信公众平台左侧的 开发—>基本配置—>服务器配置(前提是你已经注册成为开发者)

当我们填写完这些信息提交过后,微信服务器向我自己的服务器发送一个GET请求,这个请求附带四个参数,signature(签名),timestamp(时间戳),nonce(随机数),echostr(随机字符串)

2、验证消息来自服务器

当我们服务器接收到请求后,需要验证此请求是否来自微信服务器,具体验证方法如下

1)将token、timestamp、nonce三个参数进行字典序排序

2)将三个参数字符串拼接成一个字符串进行sha1加密

3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

这个过程就是按照微信自己的加密方式将请求带过来的参数进行加密,如果加密过后的值与微信服务器带过来signature(签名)一致,就代表这个请求是微信服务器发过来的,此时返回$echostr给微信服务器即可接入成功

代码如下:

class Api extends Controller
{
//    此token要与我们微信公众平台填写的token要一致
    protected $token='test';
//    服务器接口,微信公众平台填写的url
    public function handler(){
        $echostr=$_GET['echostr'];
//        验证签名是否正确
        if ($this->checksignature()){
            echo $echostr;
            exit;
        }
    }
//    验证签名
    public function checksignature(){
        $signature=$_GET['signature'];
        $timestamp=$_GET['timestamp'];
        $nonce=$_GET['nonce'];
        $token=$this->token;
//        将token,timestamp,nonce字典化排序
        $tmparr=[$token,$timestamp,$nonce];
        sort($tmparr);
//        将三个参数拼接成字符串
        $tmpstr=implode($tmparr);
//        将此字符串通过sha1方法加密
        $tmpstr=sha1($tmpstr);
//        将加密过后的字符串与signature进行比对
        if ($tmpstr==$signature){
            return true;
        }else{
            return false;
        }
    }
}

实际开发过程是先有第二步后有第一步,当我们定义好了验证方法后,再到微信公众号中填写服务器配置,当提交过后显示token验证成功,表示接入微信服务器成功

2018-10-22 09:59:36 weixin_41695965 阅读数 5013
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

微信开发 — 调用微信上传图片接口,并保存到自己的服务器

整体思路是这样的:
1.先把手机上的图片上传到微信服务器,然后返回一个图片ID
2.在通过后台根据ID从微信后台拿到流,保存到服务器
前几个步骤在之前的博客上有提到调通wx.config{}
js

$.ajax({
		type : "post",
		url : "wx/sys.do", //之前的博客上有写到
		data : {
			"url" : location.href.split('#')[0]
		},
		dataType : "json",
		success : function(data) {
			wx.config({
				debug : false, // 开启调试模式   
				appId : data.data.appId,
				timestamp : data.data.timestamp,
				nonceStr : data.data.nonceStr,
				signature : data.data.signature,
				jsApiList : [ 'checkJsApi', 'uploadImage', 'chooseImage' ]
			// 必填,需要使用的JS接口列表,所有JS接口列表见附录2 
			});
			wx.error(function(res) {
				alert("出错了:" + res.errMsg);//这个地方的好处就是wx.config配置错误,会弹出窗口哪里错误,然后根据微信文档查询即可。
			});

			wx.ready(function() {
				wx.checkJsApi({
					jsApiList : [ 'chooseImage' ],
					success : function(res) {

					}
				});
			});
			//点击按钮
			$("#scanQRCode").click(function() {
				wx.chooseImage({
					count : 1, // 默认9
					sizeType : [ 'original', 'compressed' ], // 可以指定是原图还是压缩图,默认二者都有
					sourceType : [ 'album', 'camera' ], // 可以指定来源是相册还是相机,默认二者都有
					success : function(res) {
						var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
						localIdArr = localIds;
						uploadImg(localIds);
					}
				});
			});

		}
	});

	var int = 0;
	var serverIdArr = new Array();
	var localIdArr = new Array();
	function uploadImg(localIds) {//上传成功,微信服务器会返回一个本地ID,可以预览
		wx.uploadImage({//根据本地ID获得微信服务器ID
			localId : localIds[int].toString(), // 需要上传的图片的本地ID,由chooseImage接口获得
			isShowProgressTips : 1, // 默认为1,显示进度提示
			success : function(res) {
				var serverId = res.serverId; // 返回图片的服务器端ID
				var id = $('#id').val();//id
				$.ajax({
					type : "post",
					//这个方法很重要
					url : "wx/upload.do?mediaId=" + serverId + "&id=" + id,//mediaId这个就是微信返回的id传到后台
					data : {
					//data: {"mediaId": serverId},  
					},
					dataType : "json",
					success : function(msg) {
						if (msg.code == 1) {
							top.layer.msg("上传成功!", {
								icon : 6
							});
							location.reload();
						} else {
							lock = true;
							top.layer.msg(msg.msg, {
								icon : 5
							});
						}
					}
				});

			}
		});
	}

jsp
因为框架不同 样式可能不太一样
我这个上传成功后刷新页面从服务器取一下上传的图片

<div class="layui-input-block" style="margin-top: 10px; margin-bottom: 10px; display: block;" id="divy">
			<img <c:if test="${url.url == null}">src="images/null.jpg" </c:if> src="/${url.url}" width="160px" height="150px" />
</div>
<div class="layui-input-block" style="margin-top: 10px; margin-bottom: 10px;">
			<button class="layui-btn layui-btn-normal" id="scanQRCode" style="text-align: center; background-color: #ff4e00; width: 160px;">上传微信二维码</button>
</div> 

Controller

/**
	 * @Method 微信图片下载到服务器
	 * @author 
	 * @throws Exception
	 * @createTime
	 */
	@ResponseBody
	@RequestMapping("upload")
	public JsonBean upload(String mediaId, HttpServletRequest servletRequest, HttpServletRequest request, int id) throws Exception {
		InputStream input = null;
		FileOutputStream output = null;
		try {
		// 从微信获取的流,这个utils就是根据返回mediaId后去流的
			input = picDownload.getInputStream(mediaId);
			String path = "qr";
			File folder = new File(uploadFilePath + path);
			if (!folder.exists()) {
				folder.mkdirs();
			}

			File targetFile = new File(folder, new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + ".jpg");
			output = new FileOutputStream(targetFile);
			IOUtils.copy(input, output);
            //上边就是把图片保存到服务器里
            //下边是数据库的一些操作
			// 如果数据库有就删除
			QrMe qrMe = qrMeService.selectTeacherId(id);
			if (qrMe != null) {
				qrMeService.deleteUrl(id);
				new File(uploadFilePath + qrMe.getUrl()).delete();
			}

			// 添加数据库
			QrMe newQrMe = new QrMe();
			newQrMe.setUrl(path + "/" + targetFile.getName());
			newQrMe.setTeacherid(id);
			return qrMeService.insertQR(newQrMe);
		} finally {
			IOUtils.closeQuietly(input);
			IOUtils.closeQuietly(output);
		}
	}

utils

package com.admin.commons.utils;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class PicDownload {

   //微信接口 
	@Autowired
	private WeiXinUtils weiXinUtils;
	
	/**
	 * 根据文件id下载文件
	 * 
	 * @param mediaId 媒体id
	 * @throws IOException
	 * @throws Exception
	 */
	public InputStream getInputStream(String mediaId) throws IOException {
		InputStream is = null;
		String url = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=" + weiXinUtils.getAccessToken() + "&media_id=" + mediaId;  根据AccessToken获取media

		try {
			URL urlGet = new URL(url);
			HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();
			http.setRequestMethod("GET"); // 必须是get方式请求
			http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
			http.setDoOutput(true);
			http.setDoInput(true);
			System.setProperty("sun.net.client.defaultConnectTimeout", "30000");// 连接超时30秒
			System.setProperty("sun.net.client.defaultReadTimeout", "30000"); // 读取超时30秒
			http.connect();
			is = http.getInputStream();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return is;
	}

	/**
	 * 获取下载图片信息(jpg)
	 * 
	 * @param mediaId 文件的id
	 * @throws Exception
	 */

	public void saveImageToDisk(String mediaId) throws Exception {
		InputStream inputStream = getInputStream(mediaId);
		byte[] data = new byte[1024];
		int len = 0;
		FileOutputStream fileOutputStream = null;
		try {
			fileOutputStream = new FileOutputStream("test1.jpg");
			while ((len = inputStream.read(data)) != -1) {
				fileOutputStream.write(data, 0, len);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (inputStream != null) {
				try {
					inputStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

			if (fileOutputStream != null) {
				try {
					fileOutputStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

刚开始接触这个功能,在网上找了很多资料踩了很多坑,图片不是直接上传到服务器的,而是先上传到微信的服务器,然后再下载到自己的服务器
前台我用的是layui框架

2018-01-15 22:14:46 MYTLJP 阅读数 4952
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

用了好几个小时的时间,整理了一下关于公众号的思维导图,由于CSDN不能上传相对应的文件,所以萍子一一的分解开的截图附上来,希望对大家有所帮助哦~
因为是电脑设备自动截图,又鉴于内容比较多,可能不是太清楚,需要的小伙伴们,可以联系我,我可以随时发给你。

学习微信公众号需要的配置

这里写图片描述


微信开发的主体、请求方式、数据类型和环境

主体

这里写图片描述

请求方式

这里写图片描述
这里写图片描述

数据类型和环境

这里写图片描述


开始开发

获取access_token值并存储

这里写图片描述
这里写图片描述


账号管理

生成带参数的二维码

这里写图片描述

长链接转短链接

这里写图片描述


消息管理

获取微信服务器的IP地址

接收普通消息

接收事件推送

被动回复用户消息

这里写图片描述


微信网页授权

微信网页授权步骤

第一步:跳转页面,用户同意授权,获取code

这里写图片描述

第二步:通过code换取网页授权access_token(与普通的access_token不一样,具体见下方)
第三步:如果需要,刷新access_token值

这里写图片描述

第四步:拉取用户信息(需要scope为snsapi_userinfo)
第五步:附,检验授权凭证access_token是否有效,一般用不到

这里写图片描述


微信JS-SDK

说明

这里写图片描述

JS-SDK使用步骤

这里写图片描述

上传图片素材

这里写图片描述


微信公众号

握手协议

这里写图片描述

自定义菜单

自定义菜单类型

这里写图片描述

自定义菜单的设置

这里写图片描述

自定义菜单参数说明

这里写图片描述

获取自定义菜单

这里写图片描述


自定义菜单事件推送/被动回复用户信息

自定义事件推送

这里写图片描述

被动回复用户信息

这里写图片描述

根据菜单类型的点击,被动回复

点击按钮事件

这里写图片描述

公众号首次被某个用户关注的推送

这里写图片描述

微信扫一扫,并展示扫的内容

这里写图片描述

推送图文消息

这里写图片描述

回复图片消息
没有点击按钮

这里写图片描述

java微信开发小结

阅读数 580

微信开发订阅号

阅读数 443

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