微信小程序卡卷签名错误无法找到原因,希望这方面的大佬能正解!万分感谢~
最近开发微信小程序的时候遇到卡卷签名错误的问题,因为我是前端人员,不太懂后台,在网上各种找结果还是签名错误,让我很头痛,希望小程序这方面的大佬能正解一下,在下感激不尽!
后台已经成功获得签名并校验(这里有个小问题就是签名校验排序问题,我在我电脑测试的时候api_ticket与timestamp没有进行交换位置所以签名校验(地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=cardsign)不一样,但是他们电脑出现位置交换(timestamp在第一个)),我们没有自定义code没有指定openid,所以这两个参数都没有用到!
后台代码:
<?phpdefine("appID", $_POST["appid"]);define("appsecret", $_POST["secret"]);class JSSDK {private $appId;private $appSecret;public function __construct($appId, $appSecret) { $this->appId = $appId; $this->appSecret = $appSecret;}public function getSignPackage() { //获取access_token $TOKEN_URL="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appId."&secret=".$this->appSecret; $json=file_get_contents($TOKEN_URL); $result=json_decode($json,true); $ACCESS_TOKEN=$result['access_token']; //echo $ACCESS_TOKEN.'<br /><br />'; //jsapiTicket $TOKEN_URL="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=$ACCESS_TOKEN&type=wx_card"; $json=file_get_contents($TOKEN_URL); $result=json_decode($json,true); $api_ticket=$result['ticket']; //echo $jsapi_ticket.'<br /><br />'; //$jsapi_ticket = $this->getJsApiTicket(); //$url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]" ; $card_id = $_POST["card_id"] ; $timestamp = time(); $nonceStr = $this->createNonceStr(); //$string = "api_ticket=$api_ticket×tamp=$timestamp&nonce_str=$nonceStr&card_id=$card_id" ; //$string = $timestamp.$nonceStr.$api_ticket.$card_id ; //echo '<br /><br />'; $arr = array( $card_id,$api_ticket,$nonceStr,$timestamp); asort($arr, SORT_STRING); $string = ""; foreach($arr as $temp){ $string = $string.$temp; }$signature = sha1($string);//$signature = sha1($sortString ); //$signature = sha1($string ); $signPackage = array( "appId" => $this->appId, "nonceStr" => $nonceStr, "timestamp" => $timestamp, "card_id" => $card_id, "signature" => $signature, "rawString" => $string, "api_ticket" => $api_ticket ); return $signPackage; }private function createNonceStr($length = 16) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $str = ""; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str;}/*public function httpGet($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 500); curl_setopt($curl, CURLOPT_URL, $url); $res = curl_exec($curl); curl_close($curl); return $res;}*/ }$jssdk=new JSSDK(appID,appsecret);$signPackage = $jssdk->GetSignPackage(); //echo $signPackage["signature"]; $res = "<signPackage><card_id>".$signPackage["card_id"]."</card_id><timestamp>".$signPackage["timestamp"]."</timestamp><nonceStr>".$signPackage["nonceStr"]."</nonceStr><signature>".$signPackage["signature"]."</signature><api_ticket>".$signPackage["api_ticket"]."</api_ticket></signPackage>"; /*function arrayToXml( $data, $wrap= 'xml' ){ $str = "<{$wrap}>"; if( is_array( $data ) ){ if( hasIndex( $data ) ){ foreach( $data as $k=>$v ){ $str .= arrayToXml( $v, $k ); } }else{ foreach( $data as $v ){ foreach( $v as $k1=>$v1 ) $str .= arrayToXml( $v1, $k1 ); } } }else $str .= $data; $str .= "</{$wrap}>"; return $str; } $res = $this->arrayToXml($signPackage); header("Content-type: text/xml");*/ echo $res;?> |
前端代码:
onLoad:function(options){ wx.login({ success: res =>{ var code = res.code; console.log(code); if (res.code) { //发起网络请求 wx.request({ url: 'https://api.weixin.qq.com/sns/jscode2session?appid=小程序appid&secret=小程序密钥&js_code=' + code + '&grant_type=authorization_code', method: 'GET', data:{ 'appid': "小程序appid", 'secret': "小程序密钥", "code": res.code }, header:{ 'content-type': 'application/json' },//以上获取的code与openid只是为了后面的,其实现在并不用到 success:function(res){ console.log(res); var openid = res.data.openid //返回openid console.log(openid); wx.request({ url: 'https://www.dgsy888888.com/DGKJNEW/sc/sign3.php?appid="公众号appid"&secret="公众号密钥"', method:'POST', data:{ "appid":"公众号appid", //获取access_token时,使用的appid是公众号的而非小程序的 "secret":"公众号密钥" }, header:{ //'Content-type': 'application/json' 'Content-Type': 'application/x-www-form-urlencoded' }, success:function(res){ var strmobile = res.data; console.log(strmobile); var XMLParser = new Parser.DOMParser() //后台传来的是XML格式,这里就是解析 var doc = XMLParser.parseFromString(strmobile) var timestamp = doc.getElementsByTagName('timestamp')['0']; var nonceStr = doc.getElementsByTagName('nonceStr')['0']; var signature = doc.getElementsByTagName('signature')['0']; var api_ticket = doc.getElementsByTagName('api_ticket')['0']; //strmobile = [timestamp.firstChild.data, nonceStr.firstChild.data, signature.firstChild.data,api_ticket.firstChild.data] //console.log(strmobile) //添加卡卷 wx.addCard({ cardList:[{ cardId: '我们现在用的是固定cardid,这里我写死了', cardExt:'{"timestamp":"'+timestamp.firstChild.data+'","api_ticket":"'+api_ticket.firstChild.data+'","nonceStr":"'+nonceStr.firstChild.data+'","signature":"'+signature.firstChild.data+'"}' }], success:function(res){ console.log(cardList)//卡券添加结果 console.log("你成功领取会员卡") }, fail: function (res){ console.log("失败"); }, complete: function (res){ console.log("成功失败我都会执行"); } }) } }) } }) }else{ console.log('获取用户登录态失败!'+res.errMsg); } }})} |
希望大佬们出出主意帮帮我这个还没有入道的小辈,在下一鞠躬!
我的联系方式
WX:wj2578025916
邮箱:2578025916@qq.com

微信支付栏目无法发帖。。。。
支付相关问题请移步微信支付专区提问,感谢配合
别人问的是卡券,跟支付有关系吗?
卡券也是在微信支付专区提问,感谢配合
我也知道配合,可是微信支付哪里发不了贴。。。。。
发不了帖具体表现是什么?