如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人。谢谢大家!
如果解决不了,可以在文末进群交流。
写微信支付成功回调的代码,尤其要注意官方文档的一句话:
如果不注意这里,支付成功后微信会一直对这个地址进行调用,更新订单的对数据库进行操作,也会一直存在更新:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_7&index=7.
这其实不是坑的主要所在,问题是这个文档,我真的不知道该如何吐槽。一次偶然的意外才看到。这个文档说明。
好了,其他的没有什么需要特别注意的,直接上代码:
<?php
//获取接口数据,如果$_REQUEST拿不到数据,则使用file_get_contents函数获取
$post = $_REQUEST;
if ($post == null) {
$post = file_get_contents("php://input");
}
if ($post == null) {
$post = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
}
if (empty($post) || $post == null || $post == '') {
//阻止微信接口反复回调接口 文档地址 https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_7&index=7,下面这句非常重要!!!
$str='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
echo $str;
exit('Notify 非法回调');
}
/*****************微信回调返回数据样例*******************
$post = '<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wx2421b1c4370ec43b]]></appid>
<mch_id><![CDATA[10000100]]></mch_id>
<nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str>
<sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>
<trade_type><![CDATA[APP]]></trade_type>
</xml>';
*************************微信回调返回*****************/
libxml_disable_entity_loader(true); //禁止引用外部xml实体
$xml = simplexml_load_string($post, 'SimpleXMLElement', LIBXML_NOCDATA);//XML转数组
$post_data = (array)$xml;
/** 解析出来的数组
*Array
* (
* [appid] => wx1c870c0145984d30
* [bank_type] => CFT
* [cash_fee] => 100
* [fee_type] => CNY
* [is_subscribe] => N
* [mch_id] => 1297210301
* [nonce_str] => gkq1x5fxejqo5lz5eua50gg4c4la18vy
* [openid] => olSGW5BBvfep9UhlU40VFIQlcvZ0
* [out_trade_no] => fangchan_588796
* [result_code] => SUCCESS
* [return_code] => SUCCESS
* [sign] => F6890323B0A6A3765510D152D9420EAC
* [time_end] => 20180626170839
* [total_fee] => 100
* [trade_type] => JSAPI
* [transaction_id] => 4200000134201806265483331660
* )
**/
//订单号
$out_trade_no = isset($post_data['out_trade_no']) && !empty($post_data['out_trade_no']) ? $post_data['out_trade_no'] : 0;
//查询订单信息
$order_info = DB::fetch_first("SELECT * FROM order WHERE order_no = '" .$out_trade_no."'");
if(count($order_info) > 0){
//查询平台信息
$platform_info = DB::fetch_first("SELECT * FROM pingtaiInfo WHERE `open_pid`= {$order_info['part1']}");
//平台支付key
$wxpay_key = $platform_info['zhifu_key'];
//接收到的签名
$post_sign = $post_data['sign'];
unset($post_data['sign']);
//重新生成签名
$newSign = MakeSign($post_data,$wxpay_key);
//签名统一,则更新数据库
if($post_sign == $newSign){
$updateData = array();
$updateData['pay_time'] = TIMESTAMP; //支付时间
$updateData['order_status'] = 2; //订单状态
//更新order数据库
//Do what you want...
}
}
//阻止微信接口反复回调接口 文档地址 https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_7&index=7,下面这句非常重要!!!
$str='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
echo $str;
function MakeSign($params,$key){
//签名步骤一:按字典序排序数组参数
ksort($params);
$string = ToUrlParams($params); //参数进行拼接key=value&k=v
//签名步骤二:在string后加入KEY
$string = $string . "&key=".$key;
//签名步骤三:MD5加密
$string = md5($string);
//签名步骤四:所有字符转为大写
$result = strtoupper($string);
return $result;
}
function ToUrlParams( $params ){
$string = '';
if( !empty($params) ){
$array = array();
foreach( $params as $key => $value ){
$array[] = $key.'='.$value;
}
$string = implode("&",$array);
}
return $string;
}
废话不多说了,直接上代码,不懂地方可留言,或者进微信群内交流。群二维码如果过期,请加我微信:mengyilingjian.
一、ContentControl模型ContentControl模型的类型具有一个 Content 属性。Content 属性的类型为 Object,因此,对于您在 ContentControl 中可以放置的内容没有任何限制。可以使用可扩展应用程序标记语言 (XAML) 或代码来设置 Content。以下控件使用 ContentControl 内容模型:Button、Butto..._contentcontrol详解
题目描述:在未排序的数组中找到第k个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。 这...
我最近项目是基于自研的webserver框架实现的,支持C++、Java、Python等语言混合开发,上线一年多都没有发现重大问题。但就在昨天快下班时,运营同事突然打电话说生产环境无法导入报表,于是我登录生产环境,看了一下日志,发现报表文件已经正常上到服务器,但在解析时无法正常打开。 我...
shell执行方式执行1:sh xx.sh执行2:bash xx.sh执行3:需要先给文件赋予执行权限。再使用文件路径路径执行aa.sh脚本内容:[damo@future shelldemo]$ cat aa.sh#!/bin/bashecho "========================"执行方式1:[damo@future shelldemo]$ ll-rw-r--r--. 1 damo shaolin 45 11月 8 20:21 aa.sh[damo@fut_/root/.bashrc: 第 15 行:unset: prompt_command: 无法反设定: 只读 variable
普通字符串的逆序: char str[100] = "hello world"; int len = 0; while(str[len++]); // 求出字符串长度,这里的长度包含了\0比实际字符串长度大1 int min = 0; int max = len -2; while (min {
微信小程序之界面交互API07关于界面交互,在官方文档上提供了API来wx.showToast(Object object) 土司(只有提示,会在延迟时间过后消失)!显示消息提示框参数Object object属性 类型 默认值 必填 说明 最低版本 title string 是 提示的内容 icon string 'success' 否 图标 image str..._哪个交互api的参数对象没有title属性
Qt 环境是 5.6.1 ,在win7环境下安装运行。在问题栏下出现的错误是:E:\SomeCases\mywidget1\mywidget1\main.cpp:27: error: error writing to -: Invalid argument}^在应用程序输出下的错误是:mingw32-make: *** [Debug] Error 223:55:1..._error writing to
项目中已经有一个数据库Cassandra在使用,因为要操作另外一张表的数据,来达到需求的实现,要配置另外一个数据库Orcale,数据springboot的多数据源配的了, 期初不知道,就按照普通的数据库的配置来做,发现不行,领导过来一看,也说你得看看springboot的数据库配置了,不太一样,找了找其他项目上的Oracle配置,试着做了一下 import org.spring..._primarydatasource
Android Webview 键盘遮挡输入框_安卓 webview 键盘遮挡
转载自知乎“禾木清清”作者的文章。https://zhuanlan.zhihu.com/p/37107105Jupyter Notebook是数据科学家最重要的工具之一。这款工具很容易上手,但是你可能不知道它有强大的快捷键功能,可以大大加快你的开发效率。本文将介绍在MacBook中的快捷键操作。Windows用户和本文中的操作会略有不同。快捷键分为命令模式(Command Mode)和编辑模式(Edit Mode)。命令模式操作到对象是单元格(cell)。也就是可以对单元格进行插入删除等操作。当在命令模_jupyter 整体左移
<< 写此文的缘由下午有同学,在群里问了几个问题。突然发现,大家对开发代码完事后,执行测试前的步骤、流程及具体细节不是很清楚 。之前招聘过程中,也发现很多同学,确实对这块的知识有欠缺 。特别是很多公司,由于开发同学,对测试同学的能力不太相信,让测试同学,介入的环节非常少 。什么都帮测试搞定了,测试只需在哪等着版本放到测试环境,调试通了,..._關於整理提測
2019独角兽企业重金招聘Python工程师标准>>> ...