雅荷心语博客
雅荷心语
心之所向便是光
  • 首页
  • 前端之旅
  • 后端之路
  • 软件工具
  • 心灵鸡汤
  • 心路历程
  • 视频资料
  • 关于我们
    • 关于我
    • 关于我
  • 微信平台
    • 业务合作
  • 首页
  • 前端之旅
  • 后端之路
  • 软件工具
  • 心灵鸡汤
  • 心路历程
  • 视频资料
  • 关于我们
    • 关于我
    • 关于我
  • 微信平台
    • 业务合作
  • 关注本站
    • 微信
    • 微博
    • 腾讯微博
    • Twitter
    • Facebook
    • RSS订阅
Hi, 请登录     我要注册     找回密码

PHP之微信支付的爬坑之旅(中)

2015-12-30 分类:后端之路 阅读(1680) 评论(0)

起源

上一期的微信支付初步探索阶段:对微信支付的初步探索(一)
我简单的说到了微信支付的一些东西,这次依旧说说这件事,这个坑暂时还没爬出来….
上次统一下单这一块因为微信支付还没申请下来而搁浅,这次申请下来了,我们来玩一玩吧~
首先第一步:我们这个数组可以精简一下啦,最后是这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$TempArr = array(
'appid'=>$this->actionConfig()['appid'],
'mch_id'=>'1302450501',
'nonce_str'=>$nonceStr,
'body'=>'测试商品',
'detail'=>'测试商品详情',
'out_trade_no'=>'20150806125346',
'total_fee'=>1,
'spbill_create_ip'=>'123.12.12.123',
'notify_url'=>'http://wxdevelop.kuaiyoujia.com/wxpay.php',
'trade_type'=>'JSAPI',
'product_id'=>'12235413214070356458058',
'openid'=>'oDYxEuJr2LOO6D9PogEUFYKZHPkY',
);

因为官方文档说部分参数是可以不传的,统一下单文档地址

然后下一步:

我们需要计算签名:

根据文档:
签名算法
签名生成的通用步骤如下:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
key设置路径:微信商户平台(pay.weixin.qq.com)–>账户设置–>API安全–>密钥设置
首先明确一点: PHP是全世界最好的语言….
我们利用 ksort() 函数对关联数组按照键名进行升序排序。
调用actionToUrlParams()拼接字符串,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ksort($TempArr);
$TempStr = $this->actionToUrlParams($TempArr).'&$key=7199F24949FCDCA0A9F18BC2177B38A2';
public function actionToUrlParams($urlObj)
{
$buff = "";
foreach ($urlObj as $k => $v)
{
if($k != "sign"){
$buff .= $k . "=" . $v . "&";
}
}
$buff = trim($buff, "&");
return $buff;
}

注意:这里有一个坑:

在拼接字符串以后,会输出&not…,然而这个字符串会被PHP转义,如文档:http://ask.csdn.net/questions/147899
记住这里千万,不要管,不要管….
k1
血淋淋的教训,其实这里多此一举,还害我一直签名错误…….
接下来:

1
2
3
4
5
6
7
8
9
10
11
12
$signValue = strtoupper(MD5($TempSign));
$TempArr['sign'] = $signValue; //把计算出来的签名赋值到统一下单数组
$xmls = $this->actionArrToXml($TempArr); //把统一下单数组转为xml
/*数组转xml*/
public function actionArrToXml($arr){
$Tempstr = '<xml>';
foreach ($arr as $k => $v) {
$Tempstr .='<'.$k.'>'.$v.'</'.$k.'>';
}
$Tempstr .= '</xml>';
return $Tempstr;
}

注意这里也有一个坑….

这时候你会发现生成的xml有问题….如图
k4
这里千万不要惊慌,,,,因为这个字段叫body,在文档里输出被解析了…..

现在开始把我们的xml发送给微信接口获取订单信息

1
$Result = https_request('https://api.mch.weixin.qq.com/pay/unifiedorder',$xmls);//使用post 发送xml数据

这时候会有各种坑,记住,一定要核对自己传的参数与文档是否一致,注意大小写,
k2
如果一直这样,建议直接到调试页面: 调试页面地址
h9
一点一点把生成好的xml复制到项目里然后对比:

1
$xmls = '<xml><appid>'.$TempArr["appid"].'</appid><mch_id>'.$TempArr["mch_id"].'</mch_id><nonce_str>'.$TempArr["nonce_str"].'</nonce_str><body>'.$TempArr["body"].'</body><detail>'.$TempArr["detail"].'</detail><out_trade_no>'.$TempArr["out_trade_no"].'</out_trade_no><total_fee>'.$TempArr["total_fee"].'</total_fee><spbill_create_ip>'.$TempArr["spbill_create_ip"].'</spbill_create_ip><notify_url>'.$TempArr["notify_url"].'</notify_url><trade_type>'.$TempArr["trade_type"].'</trade_type><product_id>'.$TempArr["product_id"].'</product_id><openid>'.$TempArr["openid"].'</openid><sign>'.$TempArr["sign"].'</sign></xml>';

k3
如图所示:如果看到这个,恭喜你….成功了,
k3

下一步,解析xml为数组,取我们需要的数值

1
2
3
4
5
6
7
8
9
10
11
public function actionXmlToArray($xml)
{
//将XML转为array
$TempData = array();
$array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
foreach ($array_data as $k => $v)
{
$TempData[$k] = trim(str_replace(']]>','',str_replace('<![CDATA[','',$v)));
}
return $TempData;
}

g11
接下来,把数组里的参数传入到对微信支付的初步探索(一)这里说到的数组….继续下一步算签名…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public function actionWecahtPay($url,$openid){
$wecaht = new Wechats($this->actionConfig());
$timestamp = time();//时间戳
$nonceStr = substr(md5(time()),0,20); //随机字符串
$package = $this->actionUnifiedorder($nonceStr,$openid);//统一下单接口
$signType = 'MD5';
$jsTicket = $wecaht->getJsTicket($this->actionConfig()['appid']);
$string = "jsapi_ticket=$jsTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
p($string);
$signature = MD5($string);
$signPackage = array(
"appId"     => $package['appid'],
"nonceStr"  => $package['nonce_str'],
"timestamp" => $timestamp,
'package'=>'prepay_id='.$package['prepay_id'],
'signType'=>$signType,
'signature' => $signature,
);
return $signPackage;
}

注意这里也有一个坑:

1
2
3
4
5
6
7
8
$signPackage = array(
"appId"     => $package['appid'],
"nonceStr"  => $package['nonce_str'],
"timestamp" => $timestamp,
'package'=>'prepay_id='.$package['prepay_id'],
'signType'=>$signType,
'signature' => $signature,
);

1
这几个参数需要取下单接口返回的数组里面的值

然后把参数传给页面发起支付:

ol

其实这里还有坑,正在报错……

mulu
找到一些答案说这里设置目录不对,还是没有结果….等待
PHP之微信支付的爬坑之旅(下),有时间继续研究….今天到此结束

喜欢 (1) 赏 讨厌 (0)
分享到:更多 ()
标签:微信开发

相关推荐

  • 微信小程序中rpx与rem单位转换
  • 记录两个关于图片和文件的Html5新属性
  • 微信小程序框架 wepy 实现组件事件交互及通讯
  • composer下载phpqrcode给二维码中间加上logo
  • 微店开放平台与微韵商城的一些简单构思~~
  • 微信扫描二维码登陆网页的原理分析
  • 关于本地平台改版及认证机制更改的一些说明
  • 微韵全部图片资源已迁移到腾讯云存储
关于我

小天明 北京·朝阳 前端搬砖工程师

碎碎念):(来自公众号)

热门文章

  • 踩坑记录——iphone上safari开启隐身模式时localStorage变为只读-雅荷心语博客踩坑记录——iphone上safari开启隐身模式时localStorage变为只读2017-02-21评论(4)
  • 程序员是怎样一群人-雅荷心语博客程序员是怎样一群人2015-12-08评论(3)
  • 百度你个大毒瘤 - 吐糟博客这几天打不开事情-雅荷心语博客百度你个大毒瘤 – 吐糟博客这几天打不开事情2015-12-28评论(2)
  • PHP 非对称加密 openssl 加密及解密方法-雅荷心语博客PHP 非对称加密 openssl 加密及解密方法2016-05-17评论(2)
  • PHPStorm10 下载安装破解汉化-雅荷心语博客PHPStorm10 下载安装破解汉化2015-12-15评论(2)
2025年7月
一 二 三 四 五 六 日
« 六    
 123456
78910111213
14151617181920
21222324252627
28293031  

最新评论

  • 前端小武 8年前 (2017-04-06)说:
    我看到了layer
  • 丁艳平 8年前 (2017-03-03)说:
  • Dawn 9年前 (2016-09-16)说:
    call_user_func_array最后的例子是错哦,你用bc方法去调用类里 另外一个方法就知道问题所在了。情况1.调用非静态方法 第一个参数应该传[类的实例,调用方法] (既然有类实例了直接-&
  • Dawn 9年前 (2016-06-21)说:
    tp框架设置了全局捕获异常的,这也没什么。坑的是 他捕获了异常。然后全部返回404。。。不知道的 还以为自己网站被删除了
  • Dawn 9年前 (2016-05-17)说:
    构造函数里的判断 用异常机制可能更好一些

其他类型

  • 芊云全景
  • 配音兔AI配音神器

博客类型

  • 芊云全景
  • 配音兔AI配音神器

左邻右舍

  • 易水寒
  • 楼教主
  • 芊云全景
  • 贤心
  • 配音兔AI配音神器

雅荷心语博客 -心之所向便是光

联系我们关于我们

© 2025 雅荷心语博客   网站地图