微信支付开发----新版_收货地址共享接口V2

   百度的教程有不少介绍的是旧版的接口,微信官方在16年4月,更新了收货地址共享的接口,需要配置的参数都已经改变,旧版的接口已经不能使用了,大家一定要找新版接口的教程研究,以免浪费时间。  

 

   之前自己研究过微信小店的获取商品接口、支付接口,就差收货地址接口没有研究啦,这几天正好有机会研究了一下,现在整理一下,分享给大家,一起研究。

首先,我把收货地址共享的流程,整理一下。

 

 

 

1. 获得Access Token

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appId."&secret=".$appSecret;

  这一步需要调用这个接口获取ACCESS_TOKEN,而不是调用微信网页授权的接口获取的ACCESS_TOKEN,否则会提示41001错误。

代码如下:

//获取access_token,如果access_token超过有效期7200秒,则重新获取,并将获取到的新access_token,存入到数据库缓存中。
function get_access_token()                           
{		
    	$appId = '';//填写自己的微信公众号appId
	$appSecret = '';  
	$db = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);//新浪SAE mysql配置
	if ($db) {
	mysql_select_db(SAE_MYSQL_DB, $db);
    	mysql_query("set character set 'utf8'");
    	mysql_query("SET NAMES'UTF-8'");
    	$result=mysql_query("SELECT access_token,create_time FROM wx_access_token");
    	$access_token_indb = mysql_fetch_array($result);
    	if(time() - $access_token_indb['create_time'] > 7000)//上一次获取的access_token超过有效期,则重新获取。
    	{
		   //获取 access_token
		$access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appId."&secret=".$appSecret;
		$access_token_json = getUrl($access_token_url);
		$access_token = json_decode($access_token_json,true);
		$create_time = time();
        	$access_token_to_db = $access_token['access_token'];
   		$db = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); 
  		if ($db) {
    			mysql_select_db(SAE_MYSQL_DB, $db);
       			mysql_query("set character set 'utf8'");
       			mysql_query("SET NAMES'UTF-8'");
                	mysql_query("UPDATE wx_access_token SET create_time = $create_time,access_token = '$access_token_to_db'");
            	}        
    	}else{ //上一次缓存的access_token未过有效期,则直接调用上一次获取的ACCESS_TOKEN
    		$access_token['access_token'] = $access_token_indb['access_token'];
    	}
    	return $access_token['access_token'];
    
	}    
}


function getUrl($url){
    $opts = array(
        CURLOPT_TIMEOUT        => 30,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => false,
    );
    /* 根据请求类型设置特定参数 */
    $opts[CURLOPT_URL] = $url ;
    $ch = curl_init();
    curl_setopt_array($ch, $opts);
    $data  = curl_exec($ch);
    $error = curl_error($ch);
    curl_close($ch);
    return $data;
}
	$appId = '';//填写自己的微信公众号appId
	$appSecret = '';  
	$db = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);//新浪SAE mysql配置
	if ($db) {
	mysql_select_db(SAE_MYSQL_DB, $db);
    	mysql_query("set character set 'utf8'");
    	mysql_query("SET NAMES'UTF-8'");
    	$result=mysql_query("SELECT access_token,create_time FROM wx_access_token");
    	$access_token_indb = mysql_fetch_array($result);
    	if(time() - $access_token_indb['create_time'] > 7000)//上一次获取的access_token超过有效期,则重新获取。
    	{
		   //获取 access_token
		$access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appId."&secret=".$appSecret;
		$access_token_json = getUrl($access_token_url);
		$access_token = json_decode($access_token_json,true);
		$create_time = time();
        	$access_token_to_db = $access_token['access_token'];
   		$db = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); 
  		if ($db) {
    			mysql_select_db(SAE_MYSQL_DB, $db);
       			mysql_query("set character set 'utf8'");
       			mysql_query("SET NAMES'UTF-8'");
                	mysql_query("UPDATE wx_access_token SET create_time = $create_time,access_token = '$access_token_to_db'");
            	}        
    	}else{ //上一次缓存的access_token未过有效期,则直接调用上一次获取的ACCESS_TOKEN
    		$access_token['access_token'] = $access_token_indb['access_token'];
    	}
    	return $access_token['access_token'];
    
	}    
}


function getUrl($url){
    $opts = array(
        CURLOPT_TIMEOUT        => 30,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => false,
    );
    /* 根据请求类型设置特定参数 */
    $opts[CURLOPT_URL] = $url ;
    $ch = curl_init();
    curl_setopt_array($ch, $opts);
    $data  = curl_exec($ch);
    $error = curl_error($ch);
    curl_close($ch);
    return $data;
}

 

2. 获取jsapi_ticket

    先来了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过上一步得到的access_token来获取。开发者必须在自己的服务全局缓存access_token和jsapi_ticket,常用数据库保存。

https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi

接口里的ACCESS_TOKEN为第一步得到的ACCESS_TOKEN。

成功返回如下JSON:

 

{
    "errcode":0,
    "errmsg":"ok",
    "ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
    "expires_in":7200
}

注:第一步获取到的access_token和第二步获取到的jsapi_ticket的有效期都是7200秒,由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存access_token和jsapi_ticket,常用数据库保存。

 

3、生成签名signature


    签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密之后,得到签名signature。即signature=sha1(string1)。 示例:

$string1 = "jsapi_ticket=$jsapi_ticket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
//得到签名
$signature = sha1($string);

并生成签名包:

//生成签名包
$signPackage = array(
      "appId"     => $appId,
      "nonceStr"  => $nonceStr,
      "timestamp" => $timestamp,
      "url"       => $url,
      "signature" => $signature,
      "rawString" => $string1
    );

4、前往微信公众平台,设置JS安全域名。

5、通过config接口注入权限验证配置

 <script>
          wx.config({
            debug: false,
            appId: '<?php echo $signPackage["appId"];?>',
            timestamp: <?php echo $signPackage["timestamp"];?>,
            nonceStr: '<?php echo $signPackage["nonceStr"];?>',
            signature: '<?php echo $signPackage["signature"];?>',
            jsApiList: [
              // 所有要调用的 API 都要加到这个列表中
                'checkJsApi',
                'openAddress',
              ]
          });
</script>

6、通过wx.openAddress实现收货地址共享

wx.openAddress({
	    success : function(result){
	    
    	    //此处获取到地址信息,可做自己的业务操作
    		alert('收货人姓名' + result.userName);
            },cancel: function (res) {
                alert('用户取消拉出地址');
            },fail: function (res) {
                alert(JSON.stringify(res));
            }
	});

最后,点击获取收货地址按钮,就会出现选择我的地址页面啦~


感兴趣的朋友也可以扫描关注我的公众号,里面有很多笔者原创的技术文章,希望大家会喜欢:)

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值