2017-06-29 21:51:37 always_and_forever_ 阅读数 1250
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

主要讲配置,验证token,以及可能遇到的错误和需要注意的细节。

1.你肯定要有个微信公众号;if(no)return;

2.在平台上,找到 ‘开发’ –’基本配置’,

这里写图片描述

服务器地址: 你的服务器地址,推送消息会转发到这个地址上; 只支持http:80端口/ https:443端口
令牌: 作为第一次验证的标识,要和你php文件里面的token保持一致;
消息加解密: 随机生成即可;
消息加解密方式:根据需要;

至于外头的白名单配置,如果开发中不需要access_token的话,不配置白名单也没事。

3.后台需要编写验证token脚本,下面以php的为例,(你的服务器要有php环境)

<?php
/**
* wechat php test
* update time: 20141008
*/
//define your token
define("TOKEN", "weixin"); // 改成在平台上配置的token
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();
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 (!emptyempty($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(!emptyempty( $keyword ))
{
$msgType = "text";
$contentStr = "Welcome to wechat world!";
$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, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}
?>

4.后台写好之后,即可在平台上点击提交配置,出现 提交成功提示,就算配置成功。

用这个php来验证,不会有问题,如果提示 url超时,先确认你的url能不能被访问到,用postman的工具测一下,也可以抓包看一下。查看服务器有没有拦截微信的ip,登录服务器,用iptables -list 查看当前ip禁用配置。如果都没有问题,请先别怀疑这段代码,换个服务器试一下。

5.提交成功之后,别忘了启动配置

2017-09-28 21:31:22 qq_38737916 阅读数 1160
  • 微信支付开发-微信公众号开发12-微信开发php

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

    27810 人正在学习 去看看 秦子恒
PHP微信开发是指将微信与线上服务器建立链接,服务器与用户会通过微信联系起来,用户发送给微信的信息会通过微信发送到服务器上,服务器接收到信息并处理之后再通过微信返回给用户。

用户→微信→服务器→微信→用户。

这里以测试号为例,进入微信公众平台技术文档
地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432

在左侧开始开发目录中找到接口测试号申请

PHP微信开发(测试号)-建立链接 - L_H_Orz - li_hang的博客

右侧链接进入进入微信公众帐号测试号申请系统,扫码进入测试号。

进入后会看到测试号信息。
PHP微信开发(测试号)-建立链接 - L_H_Orz - li_hang的博客
 appID、appsecret,在获取access_token以及之后调用接口是用很大的作用。

接口配置信息,用于与服务器建立链接。URL:配置链接地址必须为有效的服务器地址或IP,该地址直接指向服务器用于接收微信消息的文件。Token:通俗理解为口令,链接验证时使用。
 PHP微信开发(测试号)-建立链接 - L_H_Orz - li_hang的博客
以上微信配置基本完毕。下面开始写代码。(代码写在URL地址最终指向的文件中)。

************************************************以下为php文件中的代码**********************************************
<?php

//实例化Wechat类
$wechat = new Wechat();
//调用index方法
$wechat -> index();

class Wechat{

    public $token = 'lhorz';

    public $echostr//用于验证的token
    
    public $FromUserName//消息发送人
    
    public $ToUserName//消息接收人
    
    public $MsgType//消息类型
    
    public $Content//消息内容

    public $Event;  //事件类型

    public $xmlInfo;  //接收到的MXL格式消息
    
    public function __construct() {
        $this -> echostr = $_GET['echostr'];
    }
    
    public function Index()
    {
        if($this -> echostr)
        {
            $this -> checkToken();
        }
        else
        {
            $this -> responseMsg();
        }
    }

    //验证token
    public function checkToken()
    {
        //获取本地定义token
        $token       = $this -> token;
        //接受请求信息
        $signature   = $_GET['signature'];
        $timestamp   = $_GET['timestamp'];
        $nonce       = $_GET['nonce'];
        //将接受的参数放在数组中
        $verify_arr  = [$token,$timestamp,$nonce];
        //对数进行排序
        sort($verify_arr,SORT_REGULAR);
        //将数组转化成字符串
        $verify_str  implode('',$verify_arr);
        //对字符串进行sha1加密
        $verify_sha1 sha1($verify_str);
        //将加密后的字符串和signature进行对比
        if($verify_sha1 != $signature)
        {
            //对比失败返回no
            echo 'no';die;
        }
        //对比成功返回接受到的$echostr
        echo $this -> echostr;die;
    }
    
    //接收信息&&判断类型
    public function responseMsg()
    {   
        //接收请求信息
        $this -> receiveInfo();
        //判断类型
        switch ($this -> MsgType) {
            //文本信息调用返回文本信息回复方法
            case "text": $this -> returnText(); break;
            //事件调用事件返回方法
            case "event": $this -> returnEvent(); break;
        }
    }

    //对事件进行判断
    public function returnEvent()
    {
        //对事件进行判断
     switch ($this -> Event) {
            //关注事件
            case "subscribe" : $this -> returnInfo("这是我的一个测试号,这里有机器人,可以和它聊天。"); break;
            //用户当前所在地理位置(经度、纬度)
            case "LOCATION" : $this -> returnLOCATION(); break;
        }
    }

    //获取当前用户经纬度,并调用高德地图回复地址
    public function returnLOCATION()
    {
     $Longitude = $this -> xmlInfo -> Longitude; //经度
     $Latitude  = $this -> xmlInfo -> Latitude; //伟度
     $gaode     = 'ba2cd75562d3ae5beccf20f8a12d6a55'; //高德key
        //高德获取地理位置接口路径
     $url       = 'http://restapi.amap.com/v3/geocode/regeo?output=json&location='.$Longitude.','.$Latitude.'&key='.$gaode;
     $info      file_get_contents($url);
     $data      json_decode($info,true);
     return $this -> returnInfo("您的地址为:".$data['regeocode']['formatted_address']);
    }
    
    //判断用户输入文本信息
    public function returnText()
    {
        //判断用户输入信息
        switch ($this -> Content) {
            case "测试1" : $this -> returnInfo("回复测试1"); break;
            case "测试2" : $this -> returnInfo("回复测试2"); break;
            default:$this -> returnRobot($this -> Content);break;
        }
    }

    public function returnRobot($content)
    {
     $url = 'http://www.tuling123.com/openapi/api';
     $data http_build_query(["key" => "6340fcf9b38e45279c09b8581d0760dd","info" => $content[0]]);
     $res = $this -> CURL($url,$data,false);
     $info json_decode($res,true);
     if($info['code'] == 100000)
     {
     $this -> returnInfo($info['text']);
     }
     else
     {
     $this -> returnInfo("机器人接口暂时无法使用");
     }
    }

    public function CURL($url,$data,$https true)
    {
     $ch = curl_init();
// curl_setopt($ch,CURLOPT_SAFE_UPLOAD,false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// post数据
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,$https);
// post的变量
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
$output = curl_exec($ch);
curl_close($ch);
return $output;
    }
    
    //回复文本信息
    public function returnInfo($content)
    {
        //文本信息回复格式
        $str = "<xml>
                <ToUserName><![CDATA[%s]]></ToUserName>
                <FromUserName><![CDATA[%s]]></FromUserName>
                <CreateTime>%s</CreateTime>
                <MsgType><![CDATA[text]]></MsgType>
                <Content><![CDATA[%s]]></Content>
                </xml>";
        //将占位符替换成具体信息,并输出字符串
        echo $backInfo sprintf($str,$this -> FromUserName,$this -> ToUserName,time(),$content);
    }
    
    //获取数据
    public function receiveInfo()
    {
        $xmlInfo file_get_contents("php://input");
        $this -> xmlInfo         = simplexml_load_string($xmlInfo,'SimpleXMLElement',LIBXML_NOCDATA);
        $this -> FromUserName = $this -> xmlInfo -> FromUserName;
        $this -> ToUserName   = $this -> xmlInfo -> ToUserName;
        $this -> MsgType      = $this -> xmlInfo -> MsgType;
        $this -> Content      = (array)$this -> xmlInfo -> Content;
        $this -> Event        = $this -> xmlInfo -> Event;
    }
}
2018-08-03 11:42:42 weixin_38306434 阅读数 11608
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

首先我们来看两张图,第一张是微信公众号中设置的图

第二张是测试号中的图片,之所以打马赛克是怕不良之心的人,如果有疑问可以在文章后留言,因为本人在这个问题上捣鼓了好几天,所以比较有心得,而微信公众号的开发文档或者百度的资料都不多,所以很容易走弯路

 

现在讲讲接口配置信息里面的url和token到底填啥

微信需要一个请求一个URL来响应token验证,也就是你点击确定的时候是向你指定的URL发送一个请求,在请求里面验证你的token是否正确。也就是我们需要一个外网接口让微信访问,这个接口不需要传入任何参数;注意必须是外网服务器接口,微信才能调用.

所以需要写一个接口放在服务器上


import java.io.PrintWriter;

import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
 
@RequestMapping("/wechat")
@Controller
public class WechatController {
	private static Logger logger = Logger.getLogger(WechatController.class);
 
	private static String WECHAT_TOKEN = "wx_oms";
 
	@RequestMapping(value = "/wx.do")
	public void get(HttpServletRequest request, HttpServletResponse response) throws Exception {
 
		logger.error("WechatController   ----   WechatController");
 
		System.out.println("========WechatController========= ");
		logger.info("请求进来了...");
 
		Enumeration pNames = request.getParameterNames();
		while (pNames.hasMoreElements()) {
			String name = (String) pNames.nextElement();
			String value = request.getParameter(name);
			// out.print(name + "=" + value);
 
			String log = "name =" + name + "     value =" + value;
			logger.error(log);
		}
 
		String signature = request.getParameter("signature");/// 微信加密签名
		String timestamp = request.getParameter("timestamp");/// 时间戳
		String nonce = request.getParameter("nonce"); /// 随机数
		String echostr = request.getParameter("echostr"); // 随机字符串
		PrintWriter out = response.getWriter();
 
		//if (SignUtil.checkSignature(signature, timestamp, nonce)) {
			out.print(echostr);
//		}s
		out.close();
//		out = null;
 
	}
 
}

现在我来讲讲验证原理:微信使用我们提供的token,通过算法生成签名,然后将这几个参数(signature ,timestamp ,nonceechostr )传给我们,我们服务端通过我们提供的token按照微信的算法得出一个值,如果是同一个值说明token有效

 

现在你需要通过之前说的那个外网可以访问的url访问到我们这个类,也就是用url+' /wechat/wx.do '访问到我们的方法,这样微信就可以拿到我们的token了,然后就把这个url+' /wechat/wx.do '填写在url的地方,你自己在代码中设置的token填写在token的地方就可以完成验证了

2016-10-31 10:43:28 ding_zhi_jie 阅读数 6670
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

微信公众平台基础开发步骤主要有三步:

1、填写服务器

2、验证服务器地址的有效性

3、依据接口文档实现业务逻辑

    第一步大家应该都不陌生,其实就是在开启开发者模式后需要配置的自己程序所在服务器的路径(必须得是可以公网访问的域名或ip地址),例如http://www.abc.com/weixin/index.php,配置这个其实就是告诉微信服务器,每次微信端发送过来的处理以后就经过你自己的程序去运行,之后反馈处理结果,而不是像以前统统是交给微信服务器做处理。在填写好了相关配置后,就到了第二步的服务器地址有效性验证。

第二步是,当我们提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,我们通过自己程序的处理,返回给微信服务器所需要的验证信息,当验证通过时,接入微信api则生效。微信服务器发送出GET请求有4个参数,signature微信加密签名、echostr随机字符串、timestamp时间戳、nonce随机数,我们在我们自己的代码中需首先获取到这四个参数,然后根据相关要求对这些数据做出处理,流程如下:

校验流程如下:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 获得加密后的字符串可与signature对比,标识该请求来源于微信
比如说我们的项目入口文件是index.php的index方法,在这里我们就需要按要求写出处理逻辑

//微信api接入验证 
public function index()
{
	//获得几个参数
	$token     = 'YourTokenString';//此处填写之前开发者配置的token
	$nonce     = $_GET['nonce'];
	$timestamp = $_GET['timestamp'];
	$echostr   = $_GET['echostr'];
	$signature = $_GET['signature'];
	//参数字典序排序
	$array = array();
	$array = array($nonce, $timestamp, $token);
	sort($array);
	//验证
	$str = sha1( implode( $array ) );//sha1加密
	//对比验证处理好的str与signature,若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
	if( $str  == $signature && $echostr ){
	<span style="white-space:pre">	</span>//第一次接入微信api有echostr这个参数,之后就没有了
		echo  $echostr;			
	}
	else{
		//接入成功后的其他处理
		code...
	}
}
代码填写完成后,回到第一步的配置信息填写,所有信息填写完毕点击提交,微信服务器就会根据我们写的url路径去验证微信api是否接入成功,接入成功就会提示token验证成功,这时候咱们的基础配置就算完成啦!

还有很重要的一点,微信公众号提供的api接口只支持80端口,这就需要我们在配置自己的服务器的时候要么关闭防火墙,要么在防火请中配置打开80端口,同时保证像php、mysql、nginx或者apache这些其它进程不会占用80端口。初始就是这些,如果在配置方面还有其他问题,也欢迎大家留言和我讨论,我也会尽自己最大的努力和大家一起解决遇到的问题的。

2014-11-27 21:55:39 lovely20085901 阅读数 1051
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

一、准备工作:申请微信公众号申请SAE账号(略)

(1)准备工作完成以后,进入微信公招平台的开发者中心,下载微信的sample代码。

这么墨迹

(2)点击接入指南,下载php示例代码,后面要用。

(3)怎么填写url、token和EncodingAESKey,看下面。

二、在SAE上创建App

(1)用自己的账号登录SAE,进入我的首页

这么墨迹


(2)点击创建新应用


(3)填写相关的字段。(二级域名就是应用在SAE中的专属ID,比如这儿我的应用是wxsample001

这么墨迹

     开发语言选择php

(4)创建好应用以后,进入这个应用,然后单击左侧菜单中的“代码管理”,接着点击“创建一个版本”

    创建好版本以后:

这么墨迹

点击上传代码包上传刚下载下来的微信sample示例代码。

这个应用的url就是http://1.wxsample001.sinaapp.com

(5)返回微信公众平台,在开发者中心:

url一栏填写http://1.wxsample001.sinaapp.com/wx_sample.php

token一栏暂时填写weixin

EncodingAESKey随机生成

这么墨迹

然后点击提交

(6)修改token

在上图的Token一栏随便填写一个字符串,比如token,先不要提交

在SAE上,在你的应用的代码管理页面点击编辑代码,在wx_sample.php页面中修改代码

这么墨迹

然后点击保存,并且在微信公众平台点击提交,此时提交成功。

(7)实现简单的回复功能

在wx_sample.php页面中修改代码,有现成的,直接修改即可。

把$wechatObj->valid()修改为$wechatObj->responseMsg()

然后在responseMsg函数中定制你需要回复的内容:

把$contentStr = "Welcome to wechat world";改成$contentStr = "你需要回复的内容";

然后保存。

这时任何用户发消息给微信公众号,都会得到回复。【前提是你在微信公众平台的开发者中心启用了服务器配置,当启用了服务器配置,用户发送的消息会被转发到该url,即你的应用中做处理】

看图:


真墨迹

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