2016-11-07 10:54:04 huang3513 阅读数 2904
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

微信开发者平台
1.移动应用的创建
(1)填写基本信息(应用的基本内容、应用的App图标等)
(2)填写平台信息(应用的官网、应用的平台(ios、android、wp8应用))其中要有应用签名、应用报名填写
(3)提交成功
这里写图片描述

2.提交成功之后可以进行查询填写的资料,会有7天的待审核时间,如下图:
这里写图片描述

3.申请通过的界面如下图(其中获得了朋友圈分享以及微信好友):
这里写图片描述
4.现在完成了应用创建,那么接下来就可以在你的android项目中继承你的微信朋友圈和微信好友的分享了。

2018-04-06 12:59:45 ssh456 阅读数 540
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

第一步:填写服务器配置

主要填写服务器地址(URL)、Token和EncodingAESKey,其中URL是开发者用来接收微信消息和事件的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。


第二步:验证消息的确来自微信服务器

开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:

参数描述
signature微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp时间戳
nonce随机数
echostr随机字符串

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。

1)将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

检验signature的PHP示例代码:

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;
		}
	}

第三步:依据接口文档实现业务逻辑

1)验证URL有效性成功后即接入生效,成为开发者。

2)成为开发者后,用户每次向公众号发送消息、或者产生自定义菜单、或产生微信支付订单等情况时,开发者填写的服务器配置URL将得到微信服务器推送过来的消息和事件,开发者可以依据自身业务逻辑进行响应

3)用户向公众号发送消息时,公众号方收到的消息发送者是一个OpenID,是使用用户微信号加密后的结果,每个用户对每个公众号有一个唯一的OpenID

消息回复的代码如下:

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

      	//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="123";

                	$contentStr =$this->responsekeyword($keyword) ;
                	$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType,$contentStr );
                	echo $resultStr;
                }else{
                	echo "Input something...";
                }

        }else {
        	echo "";
        	exit;
        }
    }
    
    //关键字回复
        public function responsekeyword($keywords){
            if($keywords == "天气"){
                $content="今天天气阴天";
                return $content;
            }else if($keywords == "放假"){
                $content="今年不放假";
                return $content;
                // echo "123";
            }else{
                $content="sorry I do not know!";
               return $content;
            }
            

        }

具体完整的代码如下:

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

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


class wechatCallbackapiTest
{

	public function run()
    {

    	//验证是否是接受的腾讯
	    if($this->checkSignature()==false){
        	die("非法请求");
        }

        if (isset($_GET["echostr"])) {
        	$echoStr = $_GET["echostr"];
        	echo $echoStr;
        	exit;
        } else {
        	$this->responseMsg();
        }
        //valid signature , option
        
    }

    public function responseMsg()
    {
		//get post data, May be due to the different environments
		$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
        file_put_contents("msg.txt", $postStr,FILE_APPEND);//将信息写入文件

      	//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="123";

                	$contentStr =$this->responsekeyword($keyword) ;
                	$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType,$contentStr );
                	echo $resultStr;
                }else{
                	echo "Input something...";
                }

        }else {
        	echo "";
        	exit;
        }
    }
    
    //关键字回复
        public function responsekeyword($keywords){
            if($keywords == "天气"){
                $content="今天天气阴天";
                return $content;
            }else if($keywords == "放假"){
                $content="今年不放假";
                return $content;
                // echo "123";
            }else{
                $content="sorry I do not know!";
               return $content;
            }
            

        }
		
	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;
		}
	}
}

?>






2018-07-11 15:02:11 wsadzxcleg 阅读数 3771
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

第一步:绑定域名

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

第二步:引入js文件

在页面里引入微信的jssdk文件:http://res.wx.qq.com/open/js/jweixin-1.2.0.js

第三步:调用config接口注入权限

整体就是页面通过ajax请求后台生成签名,将生成的签名和生成签名时用的参数返回,在通过wx.config接口调用验证,这个验证大概就是微信拿到wx.config接口你配的参数也生成一个签名,然后和你生成的签名比较,一样验证成功,不一样验证失败。

 前台:

$(function() {
	var data = {};
	data.htmlUrl = location.href.split('#')[0];
	$.ajax({
		url: SUrl+"/wechatUtils/getSignature",
		type: 'post',
		dataType: 'json',
		contentType: "application/json;charset=utf-8",
		data: JSON.stringify(data),
		success: function(data) {
			debugger
			if(data.resCode == "200") {
				wx.config({
					debug:true,
					appId: data.obj.appid,
					timestamp: data.obj.timestamp,
					nonceStr: data.obj.noncestr,
					signature: data.obj.signature,
					jsApiList: [
						'scanQRCode'
					]
				});
			}
		},
		error: function(jqXHR, textStatus, errorThrown) {
			if(textStatus == "timeout") {
				uTip.showDialog({
					"tip_content": "连接超时,请检查网络"
				});
			} else {
				uTip.showDialog({
					"tip_content": "加载失败,请稍后再试"
				});
			}
		}
	});

	wx.ready(function() {
		wx.checkJsApi({
			jsApiList: ['scanQRCode'],
			success: function(res) {
				if(res.checkResult.scanQRCode) {
					return true;
				} else {
					mui.toast('您的设备不支持扫码!');
				}
			}
		});
	});

	wx.error(function(res) {
		mui.toast('初始化失败!');
	});
});
wx.config验证成功会执行wx.ready里面的代码,我这里主要就是执行了wx.checkJsApi,这就是验证当前的设备是否支持扫二维码的功能。如果进入wx.error,就是wx.config验证失败了。具体的接口内容可以查看微信公众平台文档。

后台:controller

package com.xtpt.frontend.modules.wechat.web;

import java.util.HashMap;
import java.util.Map;

import com.lpcode.modules.dto.wechat.WxAccessTokenDto;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alibaba.fastjson.JSONObject;
import com.framework.core.result.Result;
import com.framework.osp.common.utils.JedisClusterUtils;
import com.lpcode.modules.dto.wechat.WxJsapiTicketDto;
import com.lpcode.modules.dto.wechat.WxSignatureDto;
import com.lpcode.modules.dto.wechat.WxTemplateMessageDto;
import com.lpcode.modules.service.impl.wechat.WeChatUtilsServiceImpl;
import com.xtpt.frontend.util.wechat.WeChatUtils;

@Controller
@RequestMapping(value="/wechatUtils")
public class WxUtilsController {
    private static final String NONCESTR = "szrq";

    @Value("${wechat.appid}")
    private String appid;
    @Value("${wechat.appsecret}")
    private String appsecret;

    @ResponseBody
    @RequestMapping(value="/getSignature" ,method = RequestMethod.POST,produces = "application/json;charset=UTF-8", consumes = "application/json;charset=UTF-8")
    public Result<WxSignatureDto> getSignature(@RequestBody JSONObject requestObject){
        Result<WxSignatureDto> result = new Result<WxSignatureDto>();
        WxSignatureDto signatureDto = new WxSignatureDto();
        String timestamp = (System.currentTimeMillis() / 1000) + "";
        signatureDto.setTimestamp(timestamp);
        signatureDto.setAppid(appid);
        signatureDto.setNoncestr(NONCESTR);
        String accessToken = WeChatUtils.getAccessToken(appid, appsecret).getAccesstoken();    //获取access_token
        String jsapiTicket = WeChatUtils.getJsapiTicket(accessToken).getJsapiticket();         //获取jsapi_ticket
        signatureDto.setSignature(WeChatUtils.getSignature(timestamp, NONCESTR, requestObject.getString("htmlUrl"), jsapiTicket)
		result.setResCode("200");
        result.setMsg("签名成功");
        result.setObj(signatureDto);

        return result;
    }
}

签名时是需要jsapi_ticket的,这个值是调用微信接口获取的,这个接口入参需要access_token。

access_token是通过调用微信调口获取的,这个接口入参需要appid和appsecret(微信公众号里的基本配置里可以拿到)。

后台:WeChatUtils.getSignature()生成签名的方法

 public static String getSignature(String timestamp, String nonceStr, String url, String jsapiTicket) {
        MessageDigest md = null;
        String string1 = "jsapi_ticket=" + jsapiTicket
                + "&noncestr=" + nonceStr + "×tamp=" + timestamp + "&url="
                + url;

        String signature = "";
        try {
            md = MessageDigest.getInstance("SHA");
            byte[] digest = md.digest(string1.getBytes());
            signature = byteToStr(digest);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return signature;
    }

这个方法就是把timestamp, nonceStr,url,jsapiTicket拼接起来生一个SHA的签名,这里注意,这几个参数不是随便拼接的,是根据参数key首字母a-z拼接的,因为参数位置不一样生成的签名也是不一样的,我这里是正确的顺序。

后台:依赖方法

    private static String byteToStr(byte[] digest) {
        String strDigest = "";
        for (int i = 0; i < digest.length; i++) {
            strDigest = strDigest + byteToHexStr(digest[i]);
        }
        return strDigest;
    }

第四步:config验证成功会执行ready

wx.ready(function(){
    // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});

2017-11-05 23:03:31 lucky_horse_1 阅读数 649
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

1.填写服务器配置

    主要填写URL、Token。

2.验证消息的确来自微信服务器

    微信公众平台开发者文档内容如下:

    如果提交第一步的信息,微信服务器将发送GET请求到填写的服务器地址URL上。

    GET请求携带参数如下表所示:
    signature:微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
    timestamp:时间戳
    nonce:随机数
    echostr:随机字符串

    开发者通过检验signature对请求进行校验。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:

    1)将token、timestamp、nonce三个参数进行字典序排序
    2)将三个参数字符串拼接成一个字符串进行sha1加密
    3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

    代码实现如下:

    首先,我们添加一个工具类,然后在工具类中我们编写一个用于检验signature的方法。

public class CheckUtil {
	
	private static final String token="xiaoma1hao";
	public static Boolean checkSignature(String signature,String timestamp,String nonce){
		
		String[] arr=new String[]{token,timestamp,nonce};
		
		//排序
		Arrays.sort(arr);
		
		//生成字符串
		StringBuilder content=new StringBuilder();
		for(int i=0;i<arr.length;i++){
			content.append(arr[i]);
		}
		
		//sha1加密
		String temp=SHA1(content.toString());//这个方法去网上下载一个
		
		return temp.equals(signature);
	}
	
	/**
	 * SHA1加密
	 */
	public final 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 "";
	}
}

    然后,在我们填写的服务器url对应的servlet里,我们重写一下doGet()方法。

public void doGet(HttpServletRequest request, HttpServletResponse response)
	throws ServletException,IOException{
			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(CheckUtil.checkSignature(signature,timestamp,nonce)){
				out.write(echostr);
			}
	}

    这样,java代码实现就完成了。

2017-12-12 18:53:34 qq_21956483 阅读数 680
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

一、绑定服务器成为开发者

微信公众号配置

登录微信公众平台官网后,在公众平台官网的开发-基本设置页面,勾选协议成为开发者,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey,其中URL是开发者用来接收微信消息和事件的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。

同时,开发者可选择消息加解密方式:明文模式、兼容模式和安全模式。模式的选择与服务器配置在提交后都会立即生效,请开发者谨慎填写及选择。加解密方式的默认状态为明文模式,选择兼容模式和安全模式需要提前配置好相关加解密代码,详情请参考消息体签名及加解密部分的文档。

这里写图片描述

服务器代码部分

开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,如果服务器代码编写不正确,开发者提交信息后,将会提示token验证失败;
GET请求携带参数如下表所示:

参数  描述
signature   微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp   时间戳
nonce   随机数
echostr 随机字符串

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:

1)将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

检验signature的PHP示例代码:

        $token = "*****";//微信服务器配置
        $signkey = array($token, $_GET['timestamp'], $_GET['nonce']);
        sort($signkey, SORT_STRING);
        $signString = implode($signkey);
        $signString = sha1($signString);       
        return $signString == $_GET['signature'];
        exit(htmlspecialchars($_GET['echostr']));

这一步骤主要是认证身份,如果不考虑安全,直接输出 获取到的 echostr,即可通过认证。

使用接口文档调用接口

成为开发者后,用户每次向公众号发送消息、或者产生自定义菜单、或产生微信支付订单等情况时,开发者填写

的服务器配置URL将得到微信服务器推送过来的消息和事件,

所以这时,开发者可以依据自身业务逻辑进行响应,如回复消息

接口调用说明

access_token机制

access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

这时程序需要做好缓存延时机制

公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在“微信公众平台-开发-基本配置”页中获得(需要已经成为开发者,且帐号没有异常状态)。调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中,点击查看设置方法,否则将无法调用成功。

关于网页授权access_token和普通access_token的区别

1、微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权access_token),通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息;

2、其他微信接口,需要通过基础支持中的“获取access_token”接口来获取到的普通access_token调用。

自定义菜单

调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中,点击查看设置方法,否则将无法调用成功。

发送消息

网页授权

微信开发

阅读数 176

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