好得很程序员自学网
  • 首页
  • 后端语言
    • C#
    • PHP
    • Python
    • java
    • Golang
    • ASP.NET
  • 前端开发
    • Angular
    • react框架
    • LayUi开发
    • javascript
    • HTML与HTML5
    • CSS与CSS3
    • jQuery
    • Bootstrap
    • NodeJS
    • Vue与小程序技术
    • Photoshop
  • 数据库技术
    • MSSQL
    • MYSQL
    • Redis
    • MongoDB
    • Oracle
    • PostgreSQL
    • Sqlite
    • 数据库基础
    • 数据库排错
  • CMS系统
    • HDHCMS
    • WordPress
    • Dedecms
    • PhpCms
    • 帝国CMS
    • ThinkPHP
    • Discuz
    • ZBlog
    • ECSHOP
  • 高手进阶
    • Android技术
    • 正则表达式
    • 数据结构与算法
  • 系统运维
    • Windows
    • apache
    • 服务器排错
    • 网站安全
    • nginx
    • linux系统
    • MacOS
  • 学习教程
    • 前端脚本教程
    • HTML与CSS 教程
    • 脚本语言教程
    • 数据库教程
    • 应用系统教程
  • 新技术
  • 编程导航
    • 区块链
    • IT资讯
    • 设计灵感
    • 建站资源
    • 开发团队
    • 程序社区
    • 图标图库
    • 图形动效
    • IDE环境
    • 在线工具
    • 调试测试
    • Node开发
    • 游戏框架
    • CSS库
    • Jquery插件
    • Js插件
    • Web框架
    • 移动端框架
    • 模块管理
    • 开发社区
    • 在线课堂
    • 框架类库
    • 项目托管
    • 云服务

当前位置:首页>后端语言>PHP
<tfoot draggable='sEl'></tfoot>

php监听支付状态 php监听文件和端口的区别

很多站长朋友们都不太清楚php监听支付状态,今天小编就来给大家整理php监听支付状态,希望对各位有所帮助,具体内容如下:

本文目录一览: 1、 php中怎样获得支付宝支付状态 2、 如何用PHP实现微信支付,求教。新手!说明详细点 3、 订单超时,活动过期解决方案:php监听redis键重复触发引发事件 4、 微信v3扫码支付二返回的notify.php怎么接收回调的值 php中怎样获得支付宝支付状态

支付宝官方API有接口和流程,大体就是带上参数,跳转到支付宝,在支付宝网站实现支付,支付宝会将结果和设定的回调URL跳转来自己的网站,进行校验数据就可以的。

如何用PHP实现微信支付,求教。新手!说明详细点

微信公众号JSAPI支付

一:配置参数

申请成功后,获取接口文件, 将所有文件放入项目根目录weixin下,在WxPay.ub.config.php中填入配置账户信息;

二:设置授权

开发者中心->网页服务->网页授权获取用户基本信息->修改;

“授权回调页面域名修改成你的域名地址即可,须保证网页授权已获得,不然会报redirect_uri 参数错误;

三:网页授权获取用户openid

js_api_call.php 请求文件中改动(所有传给微信的参数都在入口文件中接收)

$out_trade_no = $_GET['out_trade_no']; //商户系统内部订单号 32个字符内

$total_fee = $_GET['total_fee']*100; //订单总金额 单位为分,不能带小数点,所以须把价格乘以100,

不然获取prepay_id时会报错误(设置金额字段时最好设为小数点后2位)

$pay_status = get_pay_status($out_trade_no);//查看订单支付状态

$return_url = get_return_url($out_trade_no); //设置支付成功后跳转页面

//使用jsapi接口

$jsApi = new JsApi_pub();

//通过code获得openid

if (!isset($_GET['code'])) { //触发微信返回code码

//设置redirect_uri参数,返回code码地址,其实就是重定向到当前页面,获取用户code码参数

$url = WxPayConf_pub::JS_API_CALL_URL."?showwxpaytitle=1out_trade_no=$out_trade_nototal_fee=$total_fee";

$url = $jsApi->createOauthUrlForCode($url);

Header("Location: $url");

}else{ //获取code码,以获取openid

$code = $_GET['code'];

$jsApi->setCode($code);

$openid = $jsApi->getOpenId(); //用户标识

}

再就是WxPayHubHelper.php文件 JsApi_pub()类下createOauthUrlForCode($redirectUrl)方法, 第二个参数

改为 $urlObj["redirect_uri"] = urlencode($redirectUrl); //对$url变量进行url编码 不然header重定向时无法获取订单号和金额

四:设置统一支付接口参数,获取prepay_id (预支付ID 微信生成的预支付 ID,用于后续接口调用中使用)

微信支付->开发配置->支付测试->测试授权目录和测试白名单添加

(支付授权目录需要精确到最细一级的目录,且在使用时,目录名称后直接加文件名,如ccc测试数据/weixin/)

确保你 WxPayPubHelper.php文件里 UnifiedOrder_pub 这个类的getPrepayId这个方法能正常使用

这一步的调试在 getPrepayId()内 var_dump($this->result); 就能看到错误代码;

posXml这个方法后调用了createXml这个方法

function postXml() {

$xml = $this->createXml();

//**在此处查看xml文件是否正常生成

include_once("log_.php");

$log = new Log_();

$log->log_result("log.txt",$xml);

//** 由于打印一些xml格式的文件只显示字符长度,不显示内容。于是用log的形式写在服务器上调试

$this->response = $this->postXmlCurl($xml,$this->url,$this->curl_timeout);

return $this->response;

}

保证xml这个变量格式如下;

参数正确,postXmlCurl才能正确提交,提交后就能得到正确的prepay_id,就能弹出支付框了

五:使用jsapi调起支付

根据prepay_id生成jsapi支付参数

$jsApi->setPrepayId($prepay_id);

$jsApiParameters = $jsApi->getParameters();

//调用微信JS api 支付

function jsApiCall() {

WeixinJSBridge.invoke(

'getBrandWCPayRequest',

,

function(res){

WeixinJSBridge.log(res.err_msg);

if(res.err_msg == "get_brand_wcpay_request:ok") { //支付成功后

window.location.href="" //跳转地址及订单操作,在异步页面也须处理订单,防止同步时失败

}else{

alert("支付失败"+res.err_code+res.err_desc+res.err_msg);

}

}

);

}(每次请求callpay方法时须判断订单状态,防止重复提交)

六:通用通知接口 异步处理微信返回结果

支付完成后,notify.php中获取微信的回调

$xml = $GLOBALS['HTTP_RAW_POST_DATA'];

//须验证签名,并回应微信。

if($notify->checkSign() == TRUE) //签名验证通过并更新订单状态后

$notify->setReturnParameter("return_code","SUCCESS"); //设置返回码,保证支付状态改变后才返回成功

//对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,

//微信会通过一定的策略(如30分钟共8次)定期重新发起通知,

$returnXml = $notify->returnXml();

echo $returnXml;(将xml数据返回微信 当return_code为SUCCESS时,不会再通知)

//当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,

如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,

以避免函数重入造成的数据混乱.

//判断是否在微信浏览器打开

function isWeiXin(){

var ua = window.navigator.userAgent.toLowerCase();

if(ua.match(/MicroMessenger/i) == 'micromessenger'){

return true;

}else{

return false;

}

}

步骤够详细了吧,我自己实现过,所以写了日志,结合php版本的demo 大致弄得出来了,如果对整个流程不太清楚,仔细的看完微信公众号支付接口文档,你申请微信公众号支付成功了就会有的,

订单超时,活动过期解决方案:php监听redis键重复触发引发事件

订单超时,活动过期解决方案:php监听redis键重复触发引发事件

Redis的2.8.0版本之后可用,键空间消息(Redis Keyspace Notifications),配合2.0.0版本之后的SUBSCRIBE?可以完成这个定时任务的操作了,定时的单位是秒。

1.我们先订阅频道称为?redisChat

2.现在,我们重新开启个redis客户端,然后在同一个频道redisChat发布消息,订阅者可以接收到消息。

接收到的消息如下:

3.Key过期事件的Redis配置

需要这里配置notify-keyspace-events的参数为“EX” .X代表了过期事件。notify-keyspace-events “Ex”保存配置后,重启Redis的服务,使配置生效。

PHP Redis实现订阅键空间通知

redis实例化类:

redis.class.php

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

33

34

35

36

37

38

39

40

41

42

//遇到类别重复的报错,所有叫Redis2

classRedis2??

{

????private$redis;

????publicfunction__construct($host= '127.0.0.1', $port= 6379)

????{

????????$this->redis = newRedis();

????????$this->redis->connect($host, $port);

????}

????publicfunctionsetex($key, $time, $val)

????{

????????return$this->redis->setex($key, $time, $val);

????}

????publicfunctionset($key, $val)

????{

????????return$this->redis->set($key, $val);

????}

????publicfunctionget($key)

????{

????????return$this->redis->get($key);

????}

????publicfunctionexpire($key= null, $time= 0)

????{

????????return$this->redis->expire($key, $time);

????}

????publicfunctionpsubscribe($patterns= array(), $callback)

????{

????????$this->redis->psubscribe($patterns, $callback);

????}

????publicfunctionsetOption()

????{

????????$this->redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);

????}

}

过期事件的订阅:

psubscribe.php

1个

2

3

4

5

6

7

8

9

10

11

12

13

14

15

require_once'./Redis.class.php';

$redis= new\Redis2();

// 解决Redis客户端订阅时候超时情况

$redis->setOption();

$redis->psubscribe(array('__keyevent@0__:expired'), 'keyCallback');

// 回调函数,这里写处理逻辑

functionkeyCallback($redis, $pattern, $chan, $msg)

{

????echo"Pattern: $pattern\n";

????echo"Channel: $chan\n";

????echo"Payl

????oad: $msg\n\n";

????//keyCallback为订阅事件后的回调函数,这里写业务处理逻辑,

????//比如前面提到的商品不支付自动撤单,这里就可以根据订单id,来实现自动撤单

}

设置过期事件:

index.php

1个

2

3

4

require_once'./Redis.class.php';

$redis= new\Redis2();

$order_id= 123;

$redis->setex('order_id',10,$order_id);

先用命令行模式执行?psubscribe.php

在浏览器访问?index.php

效果如下:

微信v3扫码支付二返回的notify.php怎么接收回调的值

其实在写这篇文章的时候感觉自己已经落伍了,不过笔者在百度上搜索"微信支付开发之扫描支付(模式二)后如何回调"寻找答案时,发现依旧有很多朋友没有解决这个问题,所以就把自己的解决思路分享给大家。

一、下载微信支付SDK(笔者以php发开为例,sdk包为WxpayAPI_php_v3.zip)下载SDK包后解压,在解压目录下,我们会看到如下目录二、查阅微信支付开发者文档后得知,微信扫码支付的demo即为example目录下的native.php文件为了方便,我们要做的是将整个解压后的文件放入到本地环境的根目录下的wxpay(可随个人喜好命名)文件夹中三、以笔者为例,在浏览器中输入打开上面网址后,发现有两个二维码,如题,我们今天研究的是模式二扫码(官方也推荐模式二扫码支付)四、我们用手机登陆微信,扫描上面页面中的模式二的二维码,并且支付在这里我们发现一个有趣的问题,当你支付成功后,PC页面中并没有发生任何变化,所以我们考虑的主要问题是,支付后如何进行回调。

这里不说多的废话了,笔者参考了网上的诸多方法,总结如下:

1、删掉native.php文件中扫码模式一的一些html,只剩下扫码模式二的一些相关html代码。

2、由于官方文档中也说明了,扫码模式二的支付结果是异步响应,不会主动返回支付结果,所以我们采用了javascript去时时监听支付结果,然后根据请求的结果,在做下一步的页面回调。笔者最终代码如下,有兴趣的朋友可以参考下:

native.php文件

复制代码

1 <?php

2 ini_set('date.timezone','Asia/Shanghai');3 //error_reporting(E_ERROR);

4

5 require_once "lib/WxPay.Api.php";

6 require_once "WxPay.NativePay.php";

7 require_once 'log.php';

8

9 //模式一

10 /**

11 * 流程:

12 * 1、组装包含支付信息的url,生成二维码13 * 2、用户扫描二维码,进行支付

14 * 3、确定支付之后,微信服务器会回调预先配置的回调地址,在【微信开放平台-微信支付-支付配置】中进行配置15 * 4、在接到回调通知之后,用户进行统一下单支付,并返回支付信息以完成支付(见:native_notify.php)16 * 5、支付完成之后,微信服务器会通知支付成功17 * 6、在支付成功通知中需要查单确认是否真正支付成功(见:notify.php)18 */

19 $notify = new NativePay();

20 $url1 = $notify->GetPrePayUrl("123456789");21

22 //模式二

23 /**

24 * 流程:

25 * 1、调用统一下单,取得code_url,生成二维码26 * 2、用户扫描二维码,进行支付

27 * 3、支付完成之后,微信服务器会通知支付成功28 * 4、在支付成功通知中需要查单确认是否真正支付成功(见:notify.php)29 */

30 $input = new WxPayUnifiedOrder();

31 $input->SetBody("1分钱购买何宁");

32 $input->SetAttach("1分钱购买何宁");

33 $num=WxPayConfig::MCHID.date("YmdHis");34 $input->SetOut_trade_no($num);

35 $input->SetTotal_fee("1");

36 $input->SetTime_start(date("YmdHis"));37 $input->SetTime_expire(date("YmdHis", time() + 600));38 $input->SetGoods_tag("test");

39 $input->SetNotify_url("");40 $input->SetTrade_type("NATIVE");

41 $input->SetProduct_id("123456789");

42 $result = $notify->GetPayUrl($input);

43 $url2 = $result["code_url"];

44 ?>

45

46 <html>

47 <head>

48 <meta http-equiv="content-type" content="text/html;charset=utf-8"/>

49 <meta name="viewport" content="width=device-width, initial-scale=1" />

50 <title>微信支付样例</title>

51 </head>

52 <body>

53 <div style="margin-left: 10px;color:#556B2F;font-size:30px;font-weight: bolder;">扫描支付模式二</div><br/>

54 <img alt="模式二扫码支付" src="qrcode.php?data=<?php echo urlencode($url2);?>" style="width:150px;height:150px;"/>

55 <div id="myDiv"></div><div id="timer">0</div>

56 <script>

57 //设置每隔1000毫秒执行一次load() 方法58 var myIntval=setInterval(function(){load()},1000);59 function load(){

60 document.getElementById("timer").innerHTML=parseInt(document.getElementById("timer").innerHTML)+1;61 var xmlhttp;

62 if (window.XMLHttpRequest){

63 // code for IE7+, Firefox, Chrome, Opera, Safari64 xmlhttp=new XMLHttpRequest();65 }else{

66 // code for IE6, IE5

67 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");68 }

69 xmlhttp.onreadystatechange=function(){70 if (xmlhttp.readyState==4 xmlhttp.status==200){71 trade_state=xmlhttp.responseText;72 if(trade_state=='SUCCESS'){73 document.getElementById("myDiv").innerHTML='支付成功';74 //alert(transaction_id);75 //延迟3000毫秒执行tz() 方法76 clearInterval(myIntval);77 setTimeout("location.href='success.php'",3000);78

79 }else if(trade_state=='REFUND'){80 document.getElementById("myDiv").innerHTML='转入退款';81 clearInterval(myIntval);82 }else if(trade_state=='NOTPAY'){83 document.getElementById("myDiv").innerHTML='请扫码支付';84

85 }else if(trade_state=='CLOSED'){86 document.getElementById("myDiv").innerHTML='已关闭';87 clearInterval(myIntval);88 }else if(trade_state=='REVOKED'){89 document.getElementById("myDiv").innerHTML='已撤销';90 clearInterval(myIntval);91 }else if(trade_state=='USERPAYING'){92 document.getElementById("myDiv").innerHTML='用户支付中';93 }else if(trade_state=='PAYERROR'){94 document.getElementById("myDiv").innerHTML='支付失败';95 clearInterval(myIntval);96 }

97

98 }

99 }

100 //orderquery.php 文件返回订单状态,通过订单状态确定支付状态101 xmlhttp.open("POST","orderquery.php",false);102 //下面这句话必须有

103 //把标签/值对添加到要发送的头文件。

104 xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");105 xmlhttp.send("out_trade_no=<?php echo $num;?>");106

107 }

108 </script>

109

110 </body>

111 </html>

复制代码

orderquery.php代码也做了相应调整:

<?php

ini_set('date.timezone','Asia/Shanghai');error_reporting(E_ERROR);

require_once "lib/WxPay.Api.php";

require_once 'log.php';

//初始化日志

$logHandler= new CLogFileHandler("./logs/".date('Y-m-d').'.log');$log = Log::Init($logHandler, 15);

function printf_info($data)

{

foreach($data as $key=>$value){

echo "<font color='#f00;'>$key</font> : $value <br/>";}

}

if(isset($_REQUEST["transaction_id"]) $_REQUEST["transaction_id"] != ""){$transaction_id = $_REQUEST["transaction_id"];$input = new WxPayOrderQuery();

$input->SetTransaction_id($transaction_id);//printf_info(WxPayApi::orderQuery($input));$result=WxPayApi::orderQuery($input);

echo $result['trade_state'];

exit();

}

if(isset($_REQUEST["out_trade_no"]) $_REQUEST["out_trade_no"] != ""){$out_trade_no = $_REQUEST["out_trade_no"];$input = new WxPayOrderQuery();

$input->SetOut_trade_no($out_trade_no);

//printf_info(WxPayApi::orderQuery($input));$result=WxPayApi::orderQuery($input);

echo $result['trade_state'];

exit();

}

?>

新建success.php文件:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "">

<html xmlns="">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>微信支付成功</title>

</head>

<body>

<br /><br /><br /><br /><br /><br /><br />

<h1>微信支付成功</h1>

</body>

</html>

关于php监听支付状态的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。

查看更多关于php监听支付状态 php监听文件和端口的区别的详细内容...

声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did195630
更新时间:2023-04-26   阅读:23次

上一篇: php防盗链配置 php防盗链代码

下一篇:php图片怎么保存 php下载图片并保存图片

最新资料更新

  • 1.php手机端开发框架 php app开发框架
  • 2.php怎么开发xml php处理xml数据
  • 3.php扩展的路径 php常用扩展有哪些
  • 4.php保存用户信息 php登录成功保存session
  • 5.php中if应用 php中if语句
  • 6.php用户检索记录系统 php搜索数据库
  • 7.下载并安装php 下载并安装央视网
  • 8.php判断多个数字 php判断字符串是否为数字
  • 9.php下载控件 php下载器
  • 10.php写循环下拉页面 php下拉菜单的代码
  • 11.韩顺平php视频教程下载 韩顺平oracle视频
  • 12.php订单管理功能 php订单提醒功能
  • 13.php短信android Php短信对接视频
  • 14.php添加字体水印 php设置字体
  • 15.php怎样打开url php链接怎么打开
  • 16.php支付源码 php支付平台
  • 17.php会员登录与注册 php 用户登录
  • 18.phpjson提交 phppost提交
  • 19.form居中显示php form居中显示
  • 20.无法下载file.php 无法下载filedownload

CopyRight:2016-{hedonghua:year}{hedonghua:sitegs} 备案ICP:湘ICP备09009000号-16 {hedonghua:sitejym}
本站资讯不构成任何建议,仅限于个人分享,参考须谨慎!
本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。

网站内容来源于网络分享,如有侵权发邮箱到:kenbest@126.com,收到邮件我们会即时下线处理。
网站框架支持:HDHCMS   51LA统计 百度统计
Copyright © 2018-2026 「好得很程序员自学网」
[ SiteMap ]