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

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

2016-01-04 分类:后端之路 阅读(2204) 评论(0)

00:00/00:00

注意: 我用的是Yii2.0 框架 ..
对微信支付的初步探索(一)
PHP之微信支付的爬坑之旅(中)
上次做到最后还是没解决的问题 : PHP之微信支付的爬坑之旅(中)
今天早上又花了两小时,重新理一理思路,现在终于搞定

首先,我们说一说上一期的几个错误

在下单完成以后获取分配给JSAPI的数据这里用到的签名有错..
刚开始真是傻了,看了方倍工作室的微信支付文章,导致这里的签名搞错了还一直不知道,….
记住,微信支付所有的与签名有关的都需要这样走
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆ 参数名ASCII码从小到大排序(字典序);
◆ 如果参数的值为空不参与签名;
◆ 参数名区分大小写;
◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
文档地址 : 微信支付签名算法
分配时候眼瞎了,大小写写错
计算分配给JSAPI的签名时候的时间戳 这里是大写S timeStamp我写错了….
两次计算签名都要加上Key
商户平台后台获取的Key要加在计算签名字符串最后面,(见下文代码)
微信后台授权目录一定要写对
shouquan

下面来重新整理一下代码思路

openid 获取暂时略过……
首先第一步, 调用 微信支付统一下单接口 下单获取单号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public function actionUnifiedorder($nonceStr='',$openid){
$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.....*/
$TempSign = 'appid='.$TempArr["appid"].'&body='.$TempArr["body"].'&detail='.$TempArr["detail"].'&mch_id='.$TempArr["mch_id"].'&nonce_str='.$TempArr["nonce_str"].'&notify_url='.$TempArr["notify_url"].'&openid='.$TempArr["openid"].'&out_trade_no='.$TempArr["out_trade_no"].'&product_id='.$TempArr["product_id"].'&spbill_create_ip='.$TempArr["spbill_create_ip"].'&total_fee='.$TempArr["total_fee"].'&trade_type='.$TempArr["trade_type"].'&key=****';
/*第二步:MD5运算再将得到的字符串所有字符转换为大写*/
$signValue = strtoupper(MD5($TempSign));
$TempArr['sign'] = $signValue; //把计算出来的签名赋值到统一下单数组
$xmls = $this->actionArrToXml($TempArr); //把统一下单数组转为xml
$Result = https_request('https://api.mch.weixin.qq.com/pay/unifiedorder',$xmls);//使用post 发送xml数据
$data = $this->actionXmlToArray($Result);
return $data;
}

第二步,单号获取完成,计算JSAPI需要的数据,

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';
$signPackage = array(
"appId"     => $package['appid'],
"nonceStr"  => $package['nonce_str'],
"timestamp" => $timestamp,
'package'=>'prepay_id='.$package['prepay_id'],
'signType'=>$signType,
);
ksort($signPackage);
p($signPackage);
$string = 'appId='.$signPackage['appId'].'&nonceStr='.$signPackage['nonceStr'].'&package='.$signPackage['package'].'&signType='.$signPackage['signType'].'&timeStamp='.$signPackage['timestamp'].'&key=*****';
$signature = strtoupper(MD5($string));
$signPackage['signature'] = $signature;
return $signPackage;
}

其他用到的几个方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public function actionToUrlParams($urlObj)
{
$buff = "";
foreach ($urlObj as $k => $v)
{
if($k != "sign"){
$buff .= $k . "=" . $v . "&";
}
}
$buff = trim($buff, "&");
return $buff;
}
/*数组转xml*/
public function actionArrToXml($arr){
$Tempstr = '<xml>';
foreach ($arr as $k => $v) {
$Tempstr .='<'.$k.'>'.$v.'</'.$k.'>';
}
$Tempstr .= '</xml>';
return $Tempstr;
}
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;
}

最后,附上几张截图

Screenshot_2016-01-04-11-04-01
这里是 timeStamp 大小写错误时候的报错图
Screenshot_2016-01-04-11-48-57
这里是签名算错的图
Screenshot_2016-01-04-12-23-39
这里是ok的图

微信支付三部曲,到此结束

喜欢 (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 雅荷心语博客   网站地图