第一次写,主要给自己看,记录一下

利用微信开发者工具开发商城类微信小程序,开发微信支付必不可少,但微信支付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."&notify_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微信支付“签名错误”填坑相关推荐

  1. 微信小程序Swiper组件轮播图片尺寸填坑

    1.swiper图片尺寸 <!--pages/item/item.wxml--> <view> <swiper><swiper-item><ima ...

  2. 微信小程序基于云数据库简单实现帖子点赞功能。

    思路: 1·用云函数或者app.js获取用户openid,在每个帖子里面like_people数组里添加点赞过该帖子的用户openid.获取帖子云数据存放到suju:[]里. 2·点击点赞按钮图标变换 ...

  3. 关于微信小程序“南安明朗教育”活动页面错误问题记录

    关于微信小程序"南安明朗教育"活动页面错误问题记录 关于微信小程序"南安明朗教育"活动页面错误问题记录 你好! 这是一遍关于南安明朗教育的微信小程序问题解决的日 ...

  4. 微信小程序-基于canvas画画涂鸦

    代码地址如下: http://www.demodashi.com/demo/14461.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.c ...

  5. 微信小程序基于swiper组件的tab切换

    代码地址如下: http://www.demodashi.com/demo/14010.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.c ...

  6. 微信小程序基于scroll-view实现锚点定位

    代码地址如下: http://www.demodashi.com/demo/14009.html 一.前期准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.c ...

  7. 微信小程序开发——设置默认图片、错误加载图片

    wxml: <image src='{{imgArr[index]==""?defaultImg:imgList[index]}}' binderror="erro ...

  8. 微信小程序ios版本连接不了服务器,微信小程序苹果手机IOS连接报网络错误解决方案...

    微信小程序苹果手机IOS连接报网络错误,但是安卓手机正常. 这个问题主要是因为SSL版本问题,苹果版本的微信支持的是SSL v1.2,所以需要设置一下. windows服务器: 打开powershel ...

  9. 微信小程序Canvas实现手写签名

    微信小程序Canvas实现手写签名 功能描述 点击按钮显示弹窗,弹窗主体为签名板,底部两个按钮为清除和保存. 清除按钮:清空签名板 保存按钮:保存签名为图片,并关闭弹窗 关键点分析 Canvas实现手 ...

  10. 微信小程序基于云数据库实现点赞功能

    微信小程序基于云数据库实现点赞功能 微信小程序基于云数据库实现点赞功能 小Tips 2022.04.27 更新 微信小程序基于云数据库实现点赞功能 首先你要开通云开发,然后点击数据库创建集合(这里我的 ...

最新文章

  1. 微软在慕尼黑设立欧洲首个物联网实验室
  2. pom.xml常用元素解析
  3. 倒数日怎么设置起始日_起始价131亿!杭州江河汇流区85万方综合体招标延期
  4. C函数实现返回多个值的方法
  5. Android (AMS)ActivityManagerService源码分析
  6. 图像 理想低通滤波_高通滤波、低通滤波、带通滤波 python实现
  7. 【Android 12 AOSP学习】Android 12源码下载编译
  8. 华为云学院-人人学loT学习笔记- 第四章 物联网关 汇聚回传
  9. java创建mapping_详解MyBatis Generator自动创建代码(dao,mapping,poji)
  10. 一个B站下载视频的网站
  11. Spring boot项目启动报无法加载主类
  12. 3D游戏引擎设计与实现1-15
  13. 小朋友把游戏藏在计算机里,给两、三岁宝宝的60个超简单家庭早教游戏
  14. Android 小工具--圆形图片
  15. 优力优磁性照片墙,让家有吸引力 !
  16. 2021 新款手机,免费送!
  17. 计算机网络开发与管理专业就业前景,计算机网络与安全管理专业就业前景和就业方向分析...
  18. 关于 C++ 依赖管理
  19. 不间断电源 (UPS)全国产化电子元件推荐方案
  20. 视频号该如何涨粉引流,分享10种涨粉技巧+5种引流方法丨国仁网络

热门文章

  1. 【红绿灯识别】基于matlab红绿灯识别【含Matlab源码 1068期】
  2. 【图像压缩】基于matlab GUI FFT图像压缩【含Matlab源码 843期】
  3. 【图像压缩】基于matlab GUI DCT图像无损压缩【含Matlab源码 726期】
  4. sysbench线程数_分享3个Sysbench性能压测脚本及多并发压测过程
  5. 计算机表格斜杠怎么打,『excle表格怎么做斜杠线』excel怎么打斜杠
  6. html超链接点不了_Html使文本可点击而不会超链接
  7. 深入理解for循环(执行顺序)
  8. 各种排序算法总结和比较
  9. linux系统的初化始配置(临时生效和永久生效)
  10. Codeforces Round #375 (Div. 2) D. Lakes in Berland 贪心