2018-06-17 17:33:52 lmhlmh_ 阅读数 2252
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

1.打开调试器,在sources下找到要调试的文件,在行号前单击打上断点

2.点击右边的播放按钮即可单步调试,右边还有单步跳过等功能,鼠标放在变量上可以查看变量值

 

 

2018-09-01 18:50:22 qq934235475 阅读数 12406
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

写在之前:

由于业务扩展,公司需要开发小程序,之前在做RN开发,才结束,就得边学边维护。

但是,有东西学,当然是好的,正所谓工欲善其事必先利其器,开发一个新项目之前,版本管理工具可是第一位。

进入微信开发工具后,发现需要使用新的版本工具 - “工蜂”,在这之前公司用的 GitLab 搭建的服务器,本以为有什么不同,但是忘记了是 TX 的!!!咳咳,不难发现,这是微信开发工具有意推广 TX 的工蜂,其实也大同小异。

题外,工蜂?真的把我们程序猿当做蜜蜂了啊?啊,喂!

注:阅读之前,需要有git的相关操作以及机器安装Git。(补课传送门:https://git-scm.com/book/zh/v2


机器环境:

  1. Mac 10.13.3
  2. Git version 2.10.1

步骤说明:

  1. 需要登录工蜂平台(当蜜蜂传送门:https://git.code.tencent.com/users/sign_in),注册账户。
  2. 配置账户信息。
  3. 创建项目及分支。
  4. 微信开发工具配置。
  5. 拉取项目,提交合并测试。

以上五步,第一步进入自行注册即可,剩下四步。那么,废话不多说,let's go.


二,配置账户信息

登录后,点击【个人设置】配置好用户名及昵称后,在【密码设置】里配置好密码。

 


三,创建项目及分支

 

点击【返回个人中心】

 

 

右上角【创建项目】

 

 

在【新建项目】时,可以对项目名称进行命名,路径也就是项目名称啦。

 

这样,我们的项目版本库就创建好啦,当然,有的同学会问了,我的版本库是空的,那我下载什么?根据下面的提示,进入项目文件夹,比如使用微信开发工具新建了一个小程序的Project,那么进入该文件夹下,根据提示【创建一个新的版本库】进行操作即可。

四,微信开发工具配置。

使用微信开发工具打开项目,注意版本。

点击版本管理。

以下是基本的 git 操作以及分支的展示。【确实界面很简洁,看起来很舒服,但是,换成中文,竟然有一点不适应。】

接下来,点击【设置】->【网络和认证】,对账户进行配置,也就是刚才工蜂上面填写的。

配置完成啦。

注:如果需从git上拉取别的新项目,需使用git命令拉取项目到文件夹之后,再使用微信开发工具打开进行如上操作即可。

git clone "url"

五,拉取项目,提交合并测试。

点击拉取,选择分支以及合并方式即可拉取该分支下的更新。

出现这个小勾,则表示拉取成功啦,在【历史】一栏中可以查看。

 


附加步骤:

什么?为什么还会有附加步骤,说好的五步走呢?

哈哈哈哈,打不过我吧,啦啦啦啦啦啦啦啦~各位忘了,第一步不是注册账户吗,抵消抵消~

咳咳,言归正传,通常 Gitmaster 分支,是对外发布的主要稳定版本,也就是生产版本。所以,需要新建一个自己的分支对项目进行操作。

此外,需要一个 develop 分支来对大家开发的代码进行合并,之后在上线的时候,推送到 master 分支。

master 分支的 bug ,切一个新分支【命名为 master + 预计发布日期 如 master20181212 】出来进行修改,而新功能则在 develop 上继续开发。详细传送门:http://blog.jobbole.com/109466/)。

所以,我们现在需要新建一个自己的分支来供自己提交代码,上述大概的流程是:

提交并推送到【自己的分支】->合并推送到【 develop 分支】->合并推送到【 master 分支】


话不多说,开搞开搞。

点击【项目】,然后找到刚才初始化后的项目点击进入:

点击【分支】即可查看当前项目下拥有的分支

这里已经有了两个分支,一个是 master ,一个是我自己创建的分支,点击右上角【创建分支】,进行新分支创建。

输入新分支的名称,以及分支的来源(from)

创建好之后,在微信开发工具中进行相应操作。

点击【分支】即可新建一个本地分支

选择基于哪个分支创建,这里命名需和远程新建的一样

创建好之后,点击抓取

这样,我们本地有了新建的分支,远程也有了新建的分支。那么新建的分支提交并推送代码后,点击【合并】,比如我A分支提交推送后,本地检出(check out)master分支,然后合并本地的A分支,在点击推送。这样,远程的A和master分支都有了更新的代码,其他伙伴更新分支,即可下载到你提交的代码。


好了,就先写到这儿,可能说得有点快,有不详细获取错误的地方,欢迎指出。当然,有什么不明白也可以留言交流。


不知道我有没有写得通俗易懂,如果觉得哪步有疑惑,可以留言,欢迎指出不足。

下面是我自己搞的一个公众号,分享讨论交流技术~,也可以解答一些你遇到的问题,给我留言就行。

感谢 Thanks♪(・ω・)ノ。

2018-10-22 11:34:57 qq_39705237 阅读数 361
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

这几天在开发微信公众号,遇到了很多bug因此需要调试一番,首先我们要从官网上下载微信开发工具,https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1455784140

下载完成以后我们登录的时候要用公众号授权的管理员账号扫码登录,具体授权如下:

第一步用管理员账号登录微信正式公众号,然后在(开发-开发者工具)这一菜单里面找到web开发者工具,点开以后添加权限就可以了,然后你就可以用添加权限的微信账号去登录开发者工具,在这里我自己是管理员,添加的也是我自己的微信号

 

登录以后,你可以选择普通调试,也可以选择X5 Blink 内核调试,我用的是安卓手机,虽然我验证了不可以使用内核调试,但是实际上我试了一下是可以的,因为普通调试是代理,网速是特别差的,基本上会出现网页打不开的情况不建议这个调试,所以来讲一下内核调试的关键几步吧,首先要开启手机的开发者模式,然后开启usb调试的权限,然后用usb将手机和电脑连接起来,然后扫码

扫完了以后点 信息-tbs setting-是否打开tbs内核inspector调试功能

然后打开你手机上的页面,点击开始调试,然后点击页面上的inspector,然后就可以在网页上加载出来你要的页面了,强调一点如果是第一次开启调试的话,一定要注意了,你如果没有连接外网的话,你点了inspector会弹出一个空白页面在一直转圈圈,这一点可坑了我好长时间呐。然后上面的步骤操作完了,就可以愉快的在电脑上调试你手机端的页面啦

2017-08-06 17:54:12 qq_28345313 阅读数 762
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

以前公司准备开发微信公众号,自己百度一下,学习别人的做的,具体从哪看的记不清了。这是整理的笔记。贴出代码,以供参考

后台

public class WeiXinConfigModel {
public String timestamp;


public String signature;


public String noncestr;
public String appid;


public String getAppid() {
return appid;
}


public void setAppid(String appid) {
this.appid = appid;
}


public String getNoncestr() {
return noncestr;
}


public void setNoncestr(String noncestr) {
this.noncestr = noncestr;
}


public String getTimestamp() {
return timestamp;
}


public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}


public String getSignature() {
return signature;
}


public void setSignature(String signature) {
this.signature = signature;
}


}


import java.sql.Timestamp;


import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;


@Entity
@Table(name = "accesstoken")
public class AccessToken {
@Id
private String accessTokenId;
private String appid;
private String secret;
private String access_token;
private String create_time;
private Timestamp createTimeStamp;


public Timestamp getCreateTimeStamp() {
return createTimeStamp;
}
public void setCreateTimeStamp(Timestamp createTimeStamp) {
this.createTimeStamp = createTimeStamp;
}
public String getAccessTokenId() {
return accessTokenId;
}
public void setAccessTokenId(String accessTokenId) {
this.accessTokenId = accessTokenId;
}
public String getAppid() {
return appid;
}
public void setAppid(String appid) {
this.appid = appid;
}
public String getSecret() {
return secret;
}
public void setSecret(String secret) {
this.secret = secret;
}
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public String getCreate_time() {
return create_time;
}
public void setCreate_time(String create_time) {
this.create_time = create_time;
}


}


import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


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


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.carlock.model.AccessToken;
import com.carlock.model.WeiXinConfigModel;
import com.carlock.service.AccessTokenService;
@Controller
@RequestMapping("/weixin")
public class WeiXinController1 {
Logger logger = Logger.getLogger(this.getClass());
static String AppId = "wxb2fdcdfsdfdsfs";// 第三方用户唯一凭证
static String secret = "1cd9198e6bc4sdsdsdsdsds";// 第三方用户唯一凭证密钥,即appsecret


@Autowired
AccessTokenService accessTokenService;


public static String getAccessToken() {
String access_token = "";
String grant_type = "client_credential";// 获取access_token填写client_credential
// 这个url链接地址和参数皆不能变
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=" + grant_type + "&appid=" + AppId + "&secret="
+ secret;
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();
InputStream is = http.getInputStream();
int size = is.available();
byte[] jsonBytes = new byte[size];
is.read(jsonBytes);
String message = new String(jsonBytes, "UTF-8");
JSONObject demo=JSON.parseObject(message);
access_token=demo.getString("access_token");
is.close();
} catch (Exception e) {
e.printStackTrace();
}
return access_token;
}


public static String getTicket(String access_token) {
String ticket = null;
String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + access_token + "&type=jsapi";// 这个url链接和参数不能变
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();
InputStream is = http.getInputStream();
int size = is.available();
byte[] jsonBytes = new byte[size];
is.read(jsonBytes);
String message = new String(jsonBytes, "UTF-8");
JSONObject demoJson = JSON.parseObject(message);
ticket = demoJson.getString("ticket");
is.close();
} catch (Exception e) {
e.printStackTrace();
}
return ticket;
}


public static String SHA1(String decript) {
try {
MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");
digest.update(decript.getBytes());
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
// 字节数组转换为 十六进制 数
for (int i = 0; i < messageDigest.length; i++) {
String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
if (shaHex.length() < 2) {
hexString.append(0);
}
hexString.append(shaHex);
}
return hexString.toString();


} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}


@RequestMapping("/index")
@ResponseBody
public WeiXinConfigModel Index(HttpServletRequest request, HttpServletResponse response, String address,
AccessToken accessToken,Model model) {
// 1、获取AccessToken

String access_token ="";
if(access_token==null||access_token==""){
accessToken=accessTokenService.select();
if(accessToken.getAccess_token()==null||accessToken.getAccess_token().equals("")||accessToken.getAccess_token().length()<=0){
access_token=getAccessToken();
saveAccessToken(access_token);
}else{
//如果以前获取过
//access_token有失效时间,先检查以前存入的是不是已经失效
Long now = new Date().getTime();//获取当前时间的
//当前时间减去存入时间,看看是不是在失效时间范围7200S内,我这里设置的验证时间小于7200s
Long count = now - accessToken.getCreateTimeStamp();// 1000*60*2
int nowLong = 1000 * 60 * 100;// 100分钟
              if (count > nowLong) {//失效了  重新获取存入
              access_token=getAccessToken();
     saveAccessToken(access_token);
              }else{//未失效,下面直接调用,这个可以不要
              
              }
}

}
// 2、获取Ticket
String jsapi_ticket = getTicket(access_token);
// 3、时间戳和随机字符串
String noncestr = UUID.randomUUID().toString().replace("-", "").substring(0, 16);// 随机字符串
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);// 时间戳
// 5、将参数排序并拼接字符串
String str = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + noncestr + "&timestamp=" + timestamp + "&url="
+ address;
// 6、将字符串进行sha1加密
String signature = SHA1(str);
WeiXinConfigModel weixin = new WeiXinConfigModel();
weixin.setSignature(signature);
weixin.setNoncestr(noncestr);
weixin.setTimestamp(timestamp);
weixin.setAppid(AppId);
return weixin;
}

//保存access_token

public void saveAccessToken(String access_token){
try {
AccessToken accessToken=new AccessToken();
accessToken.setAccess_token(access_token);//AppId
accessToken.setAppid(AppId);
accessToken.setSecret(secret);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
Date date=new Date();
String time=df.format(date);
accessToken.setCreate_time(time);
accessTokenService.insert(accessToken); //保存accessToken,可以根据自己情况存入数据库
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}



}

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

<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script type="text/javascript">
//获取微信验证
$(function() {
var signature;
var noncestr;
var timestamp;
var appid;
var url1 = window.location.href;  //获取当前路径  记住域名一定要在微信公众号添加了安全域名配置
$(document).ready(
function() {
$.ajax({
type : "post",
url : "/weixin/index?address="+ window.location.href,//通过后台请求,获取微信验证信息
dataType : "json",
contentType : "application/json; charset=utf-8",
success : function(data) {
signature = data.signature;
noncestr = data.noncestr;
timestamp = data.timestamp; 
appid = data.appid;
wx.config({
debug : false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId : appid, // 必填,公众号的唯一标识
timestamp : timestamp1, // 必填,生成签名的时间戳
nonceStr : noncestr,// 必填,生成签名的随机串
signature : signature,// 必填,签名,见附录1
jsApiList : [ 'scanQRCode' ]// 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
//config信息验证失败
wx.error(function(res) {
alert("验证失败");
});
},
error : function(data) {
alert('网络错误');
}
});
});
});


//点击扫码按钮
$("#scanRCode").click(function(){
wx.scanQRCode({
needResult : 1,//默认0,扫描结果,微信处理,1,直接返回扫描结果
scanType : [ "qrCode" ],//指定扫二维码
success : function(res) {
var url = res.resultStr;//result为1时,扫码返回的结果  url即为二维码中数据
if(url.indexOf(",")>=0){
                     var getresult = url.split(',');
                     var getresult1 = getresult[1];
                     //弹出二维码结果
                    alert(getresult1);
                 }else{
                     //有问题
                 }
}
});    
});


2017-06-09 15:01:14 u010786200 阅读数 6033
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

废话不多说,4步解决移动端调试问题!!!!

以苹果手机为例

1、必须先下载微信web调试工具这就不多说了

2、保证手机和电脑在同一网段,手机打开无线局域网,点击所连接的网络进去后在最底部,HTTP代理选择手动,服务器设置为和本机一样的IP,端口9973

3、打开web调试工具选择移动调试---》ios设备调试---》开始调试

4、重启微信就可以访问你想调试的页面了

微信开发接口配置

阅读数 287

微信开发

阅读数 188

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