2016-11-15 11:38:46 qq_24091555 阅读数 20070
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

           由于项目需要,需要接触微信开发,并要调用微信的JS-SDK里面的接口。

       因为经验缺乏,我百度一下关于微信开发的资料,但收集的资料都不尽人意。网上的主流的微信开发是采用PHP开发的,而本人学的Java。所以对PHP微信开发只能看懂思路。更有的是,网上一些微信开发视频,也是和PHP有关的,关于用Java开发的甚少。

       无奈之下,我只好苦啃微信开发文档。大家都知道,微信官方给的开发文档真的有点那个啥,一个功能实现非要分几个地方来说,看完这块,又得点击另一个页面看完另一块,甚是麻烦。这样的设定也让我走了好多坑。

但功夫不负有心,在研究透了微信开发文档之后,我顺利在在项目中完成微信开发。现在我将微信开发的经验分享一下,希望对大家有所帮助。

       微信JS-SDK是微信公众号平台面向网页开发这提供基于微信内的网页开发工具包。接口大类分为:基础接口、分享接口、图像接口、音频接口、智能接口、设备信息、地址位置、摇一摇周边、界面操作、微信扫一扫、微信小店、微信卡劵和微信支付。一般使用频率高的就是分享接口、地理微信、微信扫一扫和微信支付。

接下来,我将主要讲解如何调用微信分享接口。

第一步,准备内网映射工具,ngrok。不清楚这个的同学可以去百度一下。https://ngrok.com为ngrok官网。要进行微信开发,内网映射工具是不可少。毕竟,我们程序员进行开发,要测试开发的产品是否能用,都先在自己的电脑跑一下。但由于ngrok的服务器在外国的,鉴于天朝的墙太高,访问可能不稳定。所以我推荐的是国内的natapp,免费和收费的都有,服务毕竟稳定可靠,只不过要想自定义二级域名就得交费成为VIP咯。

第二步,配置JS接口安全域名。登录要进行开发的公众号,点击公众设置--->功能设置。设置JS接口安全域名,要注意三点:①填写域名前面不需加上http://,例如你的域名是http://test.com,直接填写test.com即可;②域名默认80端口,只支持80和443端口,所以域名后面不能添加端口号。③该域名为你调用微信JS-SDK接口域名。

第三步,引用JS文件。在需要调用JS接口的页面引入http://res.wx.qq.com/open/js/jweixin-1.0.0.js 。


第四步,通过config接口注入权限验证配置 。具体参数有什么用处,在截图都有注释讲解。其中jsApiList为我们要使用的接口,我在下面共引用了五个接口,分别为微信好友分享、QQ好友分享、腾讯微博分享、QQ空间分享和朋友圈分享。调用的都是分享的接口。至于其他接口列表,可以去微信开发文档那浏览一下。这里就不详说。

        第五步,在服务器生成相关参数传到调用JS-SDK页面,完成授权。这是最重要的一步。如上图所示,appId,timestamp,nonceStr,signature都为必填参数。下面我将会详细说说如何生成这些参数并传回页面。

appId为开发的微信公众号的AppID(应用ID),我们可以在登录微信公众号,在开发选项中点击基本配置来查看。

timestamp为系统生成的时间戳。


nonceStr为服务器随机生成的字符串。



signature为微信JS-SDK使用权限算法。在生成signature之前,我们要拿到jsapi_ticket。官方文档是这样解释的:


我们要注意三个地方。jsapi_ticket要缓存两个小时,每过两个小时,向微信那边请求一次。获取jsapi_ticket要通过access_token。那么我们该如何获取access_token呢?


从文档可以看出,access_token需要AppID和AppSercet两个参数。而且access_token和jsapi_ticket一样,有效期皆为两小时。这就要求我们服务器要缓存access_token和jsapi_ticket,当有效期一过,就重新请求。有的人采用是用数据库来存取这两个参数,而我采用的是用Quartz定时器。关于Quartz定时器的使用,可浏览我上篇博客《SSH与Quartz集成》,里面有关于Quartz的使用方法。

AppSercet可在与APPID同一页面获取。接下来,调用接口,获取access_token。



接下来,我们用access_token去获取jsapi_ticket。


获取jsapi_ticket,就可以进行生成签名。在此之前,先看一下官方文档的签名算法。



用代码实现。


第六步,传生成的参数给网页。



第七步,调用已授权的JS接口。


第八步,利用微信Web开发者工具调试,看看是否授权成功。(微信web开发者工具可在微信开发下载)。



2016-06-27 13:39:02 qiuzhi__ke 阅读数 883
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

微信公众平台开发者文档

微信JS-SDK说明文档

http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html

 

 

2016-07-15 11:08:47 u011147065 阅读数 3432
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验。


以上了说白了,微信JSSDK其实就是微信爸爸开放了一些微信的API功能让你用,这些API功能以JSSDK的形式呈现,有摄像头,相册,支付等功能;
附上微信JSSDK的文档地址:

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN

先说说操作步骤引入JSSDK的步骤:

1.首先要去你的微信公众号或者测试号去注册安全域名,其实也就是你项目的域名地址。(注意在这里很多人就是没有填写安全域名而报错;)
这里写图片描述

2.引入JSSDK文件
3.当然要开启JSSdk啊,在这里就需要服务端配合工作了,服务端需要给你返回三个参数数据: timestamp, nonceStr,signature;
下面是完成的操作流程,完成即可任意调取JSSDK的组件;
这里写图片描述
加入
`wx.ready(function(){
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});

wx.error(function(res){
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});

2017-07-15 00:54:57 snakeMoving 阅读数 3131
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

之前没有接触过微信开发,出来工作后第一份工作是做微信开发,我的任务只是写一个接口。

进入正题,微信开发,本文的微信开发是指微信公众号开发,本文从微信开发的最基础部分做一个简单的记录,并且附上自己写的一段代码。

openid:openid其实就是一个数据库主键,是腾讯为每个公众号的唯一标识

userinfo:其实就是用户信息,这些可以授权获取到的信息及其有限,就是用户名性别地址之类的

其实微信开发文档写得很清楚了,本人啰嗦了点所以记下来了

一般我们进入一个公众号,它可能会让我们授权,其实这样他就获取到我们的信息,他可以保存到数据库,作为会员信息,这样就省去了注册的一个步骤

首先获取授权这一步,其实是开发者后台获取用户code的一个手段,code可以干嘛?code可以作为一个钥匙,通过微信提供的接口,携带着开发者的appid和秘钥,以及code

就可以获取到用户的openid和accesstoken,其实获取到这2个没什么卵用,然后你可以利用openid和accesstoken通过另外一个接口获取到用户信息,这就有用啦。

以下附上自己写的菜得抠脚的代码,还忘个各位大佬完善一些细节

package wechat.Common;

/**
 * Created by sam on 2017/7/13.
 */

/**
 * 授权后重定向的回调链接地址,请使用urlEncode对链接进行处理
 * 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),
 * snsapi_userinfo (弹出授权页面可通过openid拿到昵称、性别、所在地。
 * 并且,即使在未关注的情况下,只要用户授权,也能获取其信息)
 */
public class URLBean {
    public static final String appid = "这个写自己的";
    public static final String appsecret = "这个写自己的";
    public static final String GETCODE
            = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE#wechat_redirect";
    public static final String GETACCESSTOKENANDID
            = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
    public static final String REFRESHTOKEN
            = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN ";
    //需要用get访问,https协议
    public static final String USERINFO
            = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
    public static final String BASEURL = "/grant/getCode?visitUrl=VISIT";
    public static final String PROJECT_URL = "http://2691670703.tunnel.qydev.com/WeChat";
}
package wechat.Common;

import org.apache.log4j.Logger;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.net.URLEncoder;

/**
 * Created by sam on 2017/7/13. 
 */
public class WechatFilter implements Filter{

	private Logger logger = org.apache.log4j.Logger.getLogger(this.getClass());

    public void init(FilterConfig filterConfig) throws ServletException {
        //
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        HttpServletResponse response = (HttpServletResponse)servletResponse;
        HttpSession session = request.getSession();
        String openId = (String) session.getAttribute("openid");
        String URL = request.getRequestURI();
        if(isNeedGrant(URL)){
			if(openId!=null){
				filterChain.doFilter(request,response);
			}else{
				String queryString = request.getQueryString();
				String redirect_url = "";
				if(queryString!=null) {
					redirect_url = request.getRequestURL().toString()+"?"+queryString;
				}else {
					redirect_url = request.getRequestURL().toString();
				}
				String url  = URLBean.PROJECT_URL+URLBean.BASEURL.replace("VISIT",URLEncoder.encode(redirect_url, "UTF-8"));
				String target = URLBean.GETCODE.
						replace("APPID",URLBean.appid).
						replace("SCOPE","snsapi_userinfo").
						replace("REDIRECT_URI", url);
				response.sendRedirect(target);
			}
		}else{
			filterChain.doFilter(request,response);
		}

    }

    public void destroy() {
        //
    }
	/**
	 * 需要判断是否拉取openid不然它会无限循环进来
	 */
	public boolean isNeedGrant(String url){
		//判断是否是正在走向我定义好的接口
//		if (url.contains("/grant/getCode")){
//			return true;
//		}
//		return false;
		return true;
	}
}
package wechat.Common;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import wechat.Entity.WeChatUser;
import wechat.Service.WeChatUserService;

import java.net.URLDecoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Created by sam on 2017/7/13.
 */
@Controller
@RequestMapping("/grant")
public class Grant {
	private Logger logger = Logger.getLogger(this.getClass());
	@Autowired
	private WeChatUserService weChatUserService;
	//Illegal character in scheme name at index 0
    @RequestMapping("/getCode")
    public void getCode(HttpServletRequest HttpServletRequest, 
    		HttpServletResponse httpServletResponse)throws Exception{
        //这里拉取code,然后重定向到获取openId和accessToken的地址
    	HttpSession httpSession =  HttpServletRequest.getSession();
    	String code = HttpServletRequest.getParameter("code");
    	String redirect_url = HttpServletRequest.getParameter("visitUrl");
    	redirect_url = URLDecoder.decode(redirect_url,"UTF-8");
    	String url = URLBean.GETACCESSTOKENANDID.replace("APPID", URLBean.appid).
    			replace("SECRET", URLBean.appsecret).replace("CODE", code);
    	String resp = HttpClientUtil.doGet(url);
    	AccessTokenOpenId ao = JsonUtils.jsonToPojo(resp, AccessTokenOpenId.class);
    	String openId = ao.getOpenid();
    	httpSession.setAttribute("openid", openId);
    	WeChatUser chatUser = weChatUserService.getWeChatUserByOpenId(openId);
    	if(chatUser==null) {
    		String userinfojson = HttpClientUtil.doGet(URLBean.USERINFO
    				.replace("ACCESS_TOKEN",ao.getAccess_token()).replace("OPENID", ao.getOpenid()));
    		chatUser = JsonUtils.jsonToPojo(userinfojson, WeChatUser.class);
    		weChatUserService.insert(chatUser);
    	}
    	httpSession.setAttribute("user",chatUser);
    	httpServletResponse.sendRedirect(URLDecoder.decode(redirect_url, "UTF-8"));//跳转用户最原始访问的连接
    }
 
}
里面有一些需要完善的地方,需要各位大佬自己修改一下,我写不出优雅的代码,就这样吧,仅此记录而已 --Sam

2018-08-16 10:47:40 qq_36538012 阅读数 2054
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

上一章讲到小程序页面的四种常见的跳转的方法,这一章写如何引入一个外部的js文件,既utils文件夹的用处,其实步骤很简单:

1:准备好外部想要引入的外部文件,命名为util.js,并且填充固定的文件内容(一般是固定的库)

 

 

2:打开util.js ,继续填写重要内容将要使用的方法用module.exports给暴露出来,如图所示(
我暴露了一个方法: imageUtil,若有很多方法,则用json形式)

module.exports = {
  imageUtil: imageUtil
} 

 

3:将外部js放在指定的文件夹utils里(utils 规定存放js库和数字格式化文件)

 

 

4:在想要用到这个方法的js里面 require这个js,然后调用即可
(我在index.js文件里面想要调用外部文件util.js,则先要获取应用实例 :var imageUtil = require('../../utils/util.js');调用即可。)

 

 

 

阅读链接:
微信小程序从零开始开发步骤(一)搭建开发环境https://www.jianshu.com/p/0ff8c3b2f59f
微信小程序从零开始开发步骤(二)创建小程序页面https://www.jianshu.com/p/fe0db14e2869
微信小程序从零开始开发步骤(三)底部导航栏https://www.jianshu.com/p/89a63dc99839
微信小程序从零开始开发步骤(四)自定义分享的功能https://www.jianshu.com/p/65d9bdb8051d
微信小程序从零开始开发步骤(五)轮播图https://www.jianshu.com/p/bc3261557031
微信小程序从零开始开发步骤(六)4种页面跳转的方法https://www.jianshu.com/p/01a5a6a0fdb9
微信小程序从零开始开发步骤(七)引入外部js 文件https://www.jianshu.com/p/5f2cde64d7f2
微信小程序从零开始开发步骤(八)引入框架WeUI:https://www.jianshu.com/p/fd423b6e17be

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