微信中比较好用的接口功能里,微信收货地址接口应该算一个,它本身提供了地址的添加删除使用,可以使微商城省去收货地址开发的步骤。微支付这个步骤并不难,本身有提供demo给你,稍微改改就能用,看一下概念也清晰了。收货地址却没有。
此文章是以PHP来实现。
在做之前先确定自己有微信公众平台的账号,并且申请了微支付,至少完成了流程前三步。
首先确定一下自己的appId,及appSecret这两个在微信支付申请成功的邮件或者微信公众平台的开发者中心查看获得。
一.接下来是文档提及的右侧这些参数的获得。
appId scope signType 这三个就不用说了,相信你们可以理解。
timeStamp 和nonceStr分别可以用PHP的
$timestamp = time();
$noncestr = rand(100000,999999);
比较麻烦的是
addrSign这个参数需要
accesstoken
,
appid
,
noncestr
,
timestamp
及
url进行字典序拼接并且SHA1的加密。我们分一下几个步骤来就不会出错了。
1.获取accesstoken
需要先在公众平台后台-开发者中心-接口权限表-OAuth2.0网页授权中设置可以获取授权的域名
通过以下链接获取授权 https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=redirect_uri&response_type=code&scope=snsapi_base&state=123#wechat_redirect
代码如下:
<a href="https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=redirect_uri&response_type=code&scope=snsapi_base&state=123#wechat_redirect">进入</a>
记住要,替换里面的APPID,redirect_uri为自己的,redirect_uri是你要回调的地址
$url="http://baidu.com/wechatpay/addr.php";
$info=urlencode($url);
特别注意:scope对应的值必须是snsapi_base,state则可以随便填写。请求这个链接后会跳转到$url这个地址
返回的链接中是带有code参数的,可以用$_GET获取。接着
$str=$_GET['code'];
$info="https://api.weixin.qq.com/sns/oauth2/access_token?appid={$appid}&secret={$appsecret}&code={$str}&grant_type=authorization_code";
$data=file_get_contents("$info");
$user_array=json_decode("$data",true);
<span style="white-space:pre"> </span>$accesstoken=$user_array['access_token'];
//通过file_get_contents获取json然后用json_decode转为数组,就可以得到access_token了~在此原谅我英文不好,所以命名方式有点难以理解
2.获取调用接口的页面的URL
$url="http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
这样子是最不会出错了。
3.拼接算法。
进行加密的字段有accesstoken,appid,noncestr,timestamp及url。要进行字典序并且URL键值式拼接成字符串。(注意,参与签名的参数的key必须小写,顺序按key的ASCII码从小到大排序。)于是如下:
$data=array("accesstoken"=>"{$accesstoken}","appid"=>"{$appid}","noncestr"=>"{$noncestr}","timestamp"=>"{$timestamp}","url"=>"{$url}");
$signPars = '';
ksort($data);
foreach($data as $k => $v) {
if("" != $v && "sign" != $k) {
if($signPars == '')
$signPars .= $k . "=" . $v;
else
$signPars .= "&". $k . "=" . $v;
}
}
$addrSign = SHA1($signPars);
这样子就得出 addrSign.接下去第二步了。
二.微信调用
必然是调用微信的JSAPI的代码,这是最关键的。细节错误一定要注意。
<span style="font-family:Microsoft YaHei;background-color: rgb(153, 255, 153);"><script language="javascript"></span>
<span style="font-family:Microsoft YaHei;"><span style="background-color: rgb(153, 255, 153);">function getaddr(){
WeixinJSBridge.invoke('editAddress',{
</span><span style="background-color: rgb(255, 0, 0);">"appId" : "<?php echo $appid ?>",
"scope" : "jsapi_address",
"signType" : "sha1",
"addrSign" : "<?php echo $addrsign ?>",
"timeStamp" : "<?php echo $timestamp ?>",
"nonceStr" : "<?php echo $noncestr ?>",</span><span style="background-color: rgb(153, 255, 153);">
},function(res){
</span></span>
<span style="font-family:Microsoft YaHei;"><span style="background-color: rgb(153, 255, 153);">//alert(res.err_msg);</span></span>
<span style="font-family:Microsoft YaHei;background-color: rgb(153, 255, 153);">if(res.err_msg == 'edit_address:ok'){
</span>
<span style="font-family:Microsoft YaHei;background-color: rgb(153, 255, 153);">alert("收件人:"+res.userName+" 联系电话:"+res.telNumber+" 收货地址:"+res.proviceFirstStageName+res.addressCitySecondStageName+res.addressCountiesThirdStageName+res.addressDetailInfo+" 邮编:"+res.addressPostalCode);}</span>
<span style="font-family:Microsoft YaHei;background-color: rgb(153, 255, 153);">});}</span>
<span style="font-family:Microsoft YaHei;background-color: rgb(153, 255, 153);"></span><pre name="code" class="html"><input type="submit" class="submit" onclick="getaddr()" value="确定"/>
这一步要注意的是红色部分这些的参数必须是字符串格式。 可用alert测试一下弹出res.err_msg内容。
res.err.msg弹出的内容
除此之外,如果
以下附图是注意的事项。如果还不行可以看看。
代码就到这里了,一般按流程来,是不会有什么问题的。相信这篇文章可以让你更快的理解使用。