php app 签名错误,微信小程序基于PHP微信支付“签名错误”填坑
第一次写,主要给自己看,记录一下
利用微信开发者工具开发商城类微信小程序,开发微信支付必不可少,但微信支付api开发文档说明压根看不懂,自己摸索,运行报错找不到错误代码解决方法
先说说我的开发流程吧
小程序前端——小程序js网络请求php后台——后台接收小程序传回数据——微信支付官网下载sdk包——微信商户配置——sdk配置——签名验证获取prepay_id——传回前端调用微信支付api——完成
想要完成微信支付就必须获取由微信系统后台传回的prepay_id,就必须要生成正确的签名
微信官方文档说明
查看小程序appid,商户号,商户key,小程序密钥是否正确匹配
修改商户key,原封不动的改一次 key设置路径:微信商户平台(pay.weixin.qq.com)–>账户设置–>API安全–>密钥设置
检查商户是否对支付目录授权,必须授权才可以,然后商户对appid授权会生成一个商户号对应
我就是败在了第4点上,检查了一遍又一遍发现没有授权目录与appid,因为商户号是可变动的,一定要与appid匹配我就是败在了第4点上,检查了一遍又一遍发现没有授权目录与appid,因为商户号是可变动的,一定要与appid匹配
签名算法
/*
* 小程序微信支付
*/
class WeixinPay {
protected $appid;
protected $mch_id;
protected $key;
protected $openid;
protected $out_trade_no;
protected $body;
protected $total_fee;
function __construct($appid, $openid, $mch_id, $key,$out_trade_no,$body,$total_fee) {
$this->appid = $appid;
$this->openid = $openid;
$this->mch_id = $mch_id;
$this->key = $key;
$this->out_trade_no = $out_trade_no;
$this->body = $body;
$this->total_fee = $total_fee;
}
public function pay() {
//统一下单接口
$return = $this->weixinapp();
return $return;
}
//统一下单接口
private function unifiedorder() {
$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
$jjc=$this->createNoncestr();
$parameters = array(
'appid' => $this->appid,
'body' => $this->body,
'mch_id' => $this->mch_id,
'nonce_str' => $jjc,
'notify_url' => 'https://*************/notify.php',
'openid' => $this->openid,
'out_trade_no'=> $this->out_trade_no,
'spbill_create_ip' => '*********',//授权目录的ip地址
'total_fee' => $this->total_fee,
'trade_type' => 'JSAPI'
);
$t="appid=".$this->appid."&body=".$this->body."&mch_id=".$this->mch_id."&nonce_str=".$jjc."¬ify_url=https://*************/notify.php&openid=".$this->openid."&out_trade_no=".$this->out_trade_no."&spbill_create_ip=************&total_fee=".$this->total_fee."&trade_type=JSAPI";
$t=$t."&key=************************************";
$sign=strtoupper(md5($t));
$parameters['sign']=$sign;
$xmlData = $this->arrayToXml($parameters);
$return = $this->xmlToArray($this->postXmlCurl($xmlData, $url, 60));
return $return;
}
private static function postXmlCurl($xml, $url, $second = 30)
{
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //严格校验
//设置header
curl_setopt($ch, CURLOPT_HEADER, FALSE);
//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//post提交方式
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt($ch, CURLOPT_TIMEOUT, 40);
set_time_limit(0);
//运行curl
$data = curl_exec($ch);
//返回结果
if ($data) {
curl_close($ch);
return $data;
} else {
$error = curl_errno($ch);
curl_close($ch);
throw new WxPayException("curl出错,错误码:$error");
}
}
//数组转换成xml
private function arrayToXml($arr) {
$xml = "";
foreach ($arr as $key => $val) {
if (is_array($val)) {
$xml .= "" . arrayToXml($val) . "" . $key . ">";
} else {
$xml .= "" . $val . "" . $key . ">";
}
}
$xml .= "";
return $xml;
}
//xml转换成数组
private function xmlToArray($xml) {
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
$val = json_decode(json_encode($xmlstring), true);
return $val;
}
//微信小程序接口
private function weixinapp() {
//统一下单接口
$unifiedorder = $this->unifiedorder();
// print_r($unifiedorder);
$jjc=$this->createNoncestr();
$parameters = array(
'appId' => $this->appid, //小程序ID
'nonceStr' => $jjc, //随机串
'package' => 'prepay_id=' . $unifiedorder['prepay_id'], //数据包
'signType' => 'MD5',//签名方式
'timeStamp' => '' . time() . '' //时间戳
);
//签名
$t="appId=".$this->appid."&nonceStr=".$jjc."&package=prepay_id=".$unifiedorder['prepay_id']."&signType=MD5&timeStamp=".time();
$t=$t."&key=*************************";
$sign=strtoupper(md5($t));
$parameters['paySign'] = $sign;
return $parameters;
}
//作用:产生随机字符串,不长于32位
private function createNoncestr($length = 32) {
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str = "";
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
//作用:生成签名
private function getSign($Obj) {
foreach ($Obj as $k => $v) {
$Parameters[$k] = $v;
}
//签名步骤一:按字典序排序参数
ksort($Parameters);
$String = $this->formatBizQueryParaMap($Parameters, false);
//签名步骤二:在string后加入KEY
$String = $String . "&key=" . $this->key;
//签名步骤三:MD5加密
$String = md5($String);
//签名步骤四:所有字符转为大写
$result_ = strtoupper($String);
return $result_;
}
///作用:格式化参数,签名过程需要使用
private function formatBizQueryParaMap($paraMap, $urlencode) {
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v) {
if ($urlencode) {
$v = urlencode($v);
}
$buff .= $k . "=" . $v . "&";
}
$reqPar;
if (strlen($buff) > 0) {
$reqPar = substr($buff, 0, strlen($buff) - 1);
}
return $reqPar;
}
}
以上就是我微信支付解决的过程,没有太大的坑,但是记录一下,免的以后自己再次遇到
php app 签名错误,微信小程序基于PHP微信支付“签名错误”填坑相关推荐
- 微信小程序Swiper组件轮播图片尺寸填坑
1.swiper图片尺寸 <!--pages/item/item.wxml--> <view> <swiper><swiper-item><ima ...
- 微信小程序基于云数据库简单实现帖子点赞功能。
思路: 1·用云函数或者app.js获取用户openid,在每个帖子里面like_people数组里添加点赞过该帖子的用户openid.获取帖子云数据存放到suju:[]里. 2·点击点赞按钮图标变换 ...
- 关于微信小程序“南安明朗教育”活动页面错误问题记录
关于微信小程序"南安明朗教育"活动页面错误问题记录 关于微信小程序"南安明朗教育"活动页面错误问题记录 你好! 这是一遍关于南安明朗教育的微信小程序问题解决的日 ...
- 微信小程序-基于canvas画画涂鸦
代码地址如下: http://www.demodashi.com/demo/14461.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.c ...
- 微信小程序基于swiper组件的tab切换
代码地址如下: http://www.demodashi.com/demo/14010.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.c ...
- 微信小程序基于scroll-view实现锚点定位
代码地址如下: http://www.demodashi.com/demo/14009.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.c ...
- 微信小程序开发——设置默认图片、错误加载图片
wxml: <image src='{{imgArr[index]==""?defaultImg:imgList[index]}}' binderror="erro ...
- 微信小程序ios版本连接不了服务器,微信小程序苹果手机IOS连接报网络错误解决方案...
微信小程序苹果手机IOS连接报网络错误,但是安卓手机正常. 这个问题主要是因为SSL版本问题,苹果版本的微信支持的是SSL v1.2,所以需要设置一下. windows服务器: 打开powershel ...
- 微信小程序Canvas实现手写签名
微信小程序Canvas实现手写签名 功能描述 点击按钮显示弹窗,弹窗主体为签名板,底部两个按钮为清除和保存. 清除按钮:清空签名板 保存按钮:保存签名为图片,并关闭弹窗 关键点分析 Canvas实现手 ...
- 微信小程序基于云数据库实现点赞功能
微信小程序基于云数据库实现点赞功能 微信小程序基于云数据库实现点赞功能 小Tips 2022.04.27 更新 微信小程序基于云数据库实现点赞功能 首先你要开通云开发,然后点击数据库创建集合(这里我的 ...
最新文章
- 微软在慕尼黑设立欧洲首个物联网实验室
- pom.xml常用元素解析
- 倒数日怎么设置起始日_起始价131亿!杭州江河汇流区85万方综合体招标延期
- C函数实现返回多个值的方法
- Android (AMS)ActivityManagerService源码分析
- 图像 理想低通滤波_高通滤波、低通滤波、带通滤波 python实现
- 【Android 12 AOSP学习】Android 12源码下载编译
- 华为云学院-人人学loT学习笔记- 第四章 物联网关 汇聚回传
- java创建mapping_详解MyBatis Generator自动创建代码(dao,mapping,poji)
- 一个B站下载视频的网站
- Spring boot项目启动报无法加载主类
- 3D游戏引擎设计与实现1-15
- 小朋友把游戏藏在计算机里,给两、三岁宝宝的60个超简单家庭早教游戏
- Android 小工具--圆形图片
- 优力优磁性照片墙,让家有吸引力 !
- 2021 新款手机,免费送!
- 计算机网络开发与管理专业就业前景,计算机网络与安全管理专业就业前景和就业方向分析...
- 关于 C++ 依赖管理
- 不间断电源 (UPS)全国产化电子元件推荐方案
- 视频号该如何涨粉引流,分享10种涨粉技巧+5种引流方法丨国仁网络
热门文章
- 【红绿灯识别】基于matlab红绿灯识别【含Matlab源码 1068期】
- 【图像压缩】基于matlab GUI FFT图像压缩【含Matlab源码 843期】
- 【图像压缩】基于matlab GUI DCT图像无损压缩【含Matlab源码 726期】
- sysbench线程数_分享3个Sysbench性能压测脚本及多并发压测过程
- 计算机表格斜杠怎么打,『excle表格怎么做斜杠线』excel怎么打斜杠
- html超链接点不了_Html使文本可点击而不会超链接
- 深入理解for循环(执行顺序)
- 各种排序算法总结和比较
- linux系统的初化始配置(临时生效和永久生效)
- Codeforces Round #375 (Div. 2) D. Lakes in Berland 贪心