当支付网关解析XML格式的返回值后,会通过服务器间通知的方式,调用XML中的程序地址。该程序会完成接收支付网关支付通知信息,验证信息有效性为用户显示支付结果(更新数据库中的账户金额完成平台的支付)和相关订单信息等。
创建文件名为GetPayHandle.php的PHP脚本文件,用来完成上述功能,代码如下:
广州网站设计
- <?
- /*******************************************
- *文件名:GetPayHandle.php
- *主要功能:完成接收支付网关支付通知信息,验证信息有效性,给用户显示支付结果和相关订单信息等
- *说明:
- * 1.本页面请不要使用诸如response.redirect等页面转向的语句
- * 2.可根据支付结果和订单号查询出本次订单信息或发货信息显示给用户
- * 3.本页面如果含有图片、样式或链接,请将路径或地址包括域名,比如<img src="http://www.yoursitename.com/imagers/aaa.gif">
- *调试链接:http://localhost/payment/PortSample/GetPayHandle.php?c_mid= 1033562&c_order=20100619&c_orderamount=18&c_ymd=20100530&c_transnum=&c_succmark=Y&c_moneytype=0&c_signstr=6f1ac09398f03c48749a0e38d872fcd8&c_memo1=10.32&c_memo2=12345
- *******************************************/
- require_once ("../inc/inc.read.dbconfig.php"); //数据库配置文件
- require_once ("../include/include.functions.php"); //公共函数库文件
- //--连接数据库
- $mysql = mysql_connect ( $mysqlconf ["host"], $mysqlconf ["user"], $mysqlconf ["pass"] ) or die ( 'Not connected : ' . mysql_error () );
- mysql_select_db ( $mysqlconf ["db"], $mysql ) or die ( 'Can\'t use foo : ' . mysql_error () );
- //--获取支付网关向发送的支付通知信息(以下简称为通知信息)
- $c_mid = $_REQUEST ['c_mid'];
- //编号,在申请成功后即可获得,可以在申请成功的邮件中获取该编号
- $c_order = $_REQUEST ['c_order']; //提供的订单号
- $c_orderamount = $_REQUEST ['c_orderamount']; //提供的订单总金额,以元为单位, 小数点后保留两位,如13.05
- $c_ymd = $_REQUEST ['c_ymd'];
- //传输过来的订单产生日期,格式为"yyyymmdd",如20050102
- $c_transnum = $_REQUEST ['c_transnum'];
- //支付网关提供的该笔订单的交易流水号,供日后查询、核对使用;
- $c_succmark = $_REQUEST ['c_succmark']; //交易成功标志,Y-成功 N-失败
- $c_moneytype = $_REQUEST ['c_moneytype']; //支付币种,0为人民币
- $c_cause = $_REQUEST ['c_cause']; //如果订单支付失败,则该值代表失败原因
- $c_memo1 = $_REQUEST ['c_memo1']; //提供的需要在支付结果通知中转发的参数一
- $c_memo2 = $_REQUEST ['c_memo2']; //提供的需要在支付结果通知中转发的参数二
- $c_signstr = $_REQUEST ['c_signstr']; //支付网关对已上信息进行MD5加密后的字符串
- //--将获得的通知信息拼成字符串,作为准备进行MD5加密的源串,需要注意的是,在拼串时,
- 先后顺序不能改变的支付密钥,在管理首页可找到该值
- $c_pass = "f3zmsjk9r7";
- $srcStr = $c_mid . $c_order . $c_orderamount . $c_ymd . $c_transnum . $c_moneytype . $c_memo1 . $c_memo2 . $c_pass;
- //--对支付通知信息进行MD5加密
- $r_signstr = md5 ( $srcStr );
- //--校验网站对通知信息的MD5加密的结果和支付网关提供的MD5加密结果是否一致
- if ($r_signstr != $c_signstr) {
- echo "签名验证失败";
- exit ();
- }
- //--校验编号
- $MerchantID = "1033562"; //商户的编号
- if ($MerchantID != $c_mid) {
- echo "提交的编号有误";
- exit ();
- }
- if ($c_succmark = "Y") {
- //程序内部调用扣费函数
- //由于在GetPayNotify.php中已进行了实际发货操作,所以在此处只要系统中查询出本订 单的结果,然后给用户显示购买成功的提示信息即可
- $score = $c_orderamount;
- $pieces = explode ( ".", $c_memo1 );
- $uid = $pieces [0]; //uid
- $cid = $pieces [1]; //cid
- //防止刷成功页面给对应账号充值
- //Update_status_record会将对应的status设置成1,只有当status=0(未充值状态) 的时候才会返回true
- //确认用户付费成功了之后将 account_detail中的status设置为1(表示充值成功)0 为失败
- $Update_status_recordUpdate_status_record = Update_status_record ( $cid, $mysql );
- //增减财富的操作
- if ($Update_status_record == 'true') {
- //对user_account表进行操作,增加货币数量
- $Charge_numCharge_num = Charge_num ( $uid, $score, $mysql );
- if (! empty ( $Charge_num )) {
- //充值金额
- $score_t = $score;
- } else {
- return false;
- }
- //--释放记录集,关闭数据库连接
- //mysql_free_result($result);
- mysql_close ( $mysql );
- } else {
- echo "-1\n"; //表示用户刷新页面
- }
- }
- ?>
【代码解读】
上述代码的核心功能是完成接收支付网关支付通知信息,验证信息有效性,给用户显示支付结果和相关订单信息等。在确认用户付费成功之后,调用公共函数库$Update_status_ record=Update_status_record()函数将数据库库中的account_detail表中的status设置为1(表示充值成功),这样就可以防止充值页面被反复刷新。然后在通过$Charge_num= Charge_ num()函数对user_account表进行操作,完成账户充值的功能。
对应的页面显示模板代码如下:
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
- <title>支付结果显示</title>
- <meta name="keywords" content="支付结果显示" />
- <meta name="description" content="支付结果显示" />
- <link href="../css/style.css" rel="stylesheet" type="text/css" />
- </head>
- <body>
- <div id="Housecenter">
- <div id="shop">
- <div class="Waretop">
- <span><img src="../img/wptopr.gif" /></span>
- <img src="../img/wptopl.gif" />
- </div>
- <div class="Waretopd">
- <div class="Waretopdw">充值成功</div>
- </div>
- <div class="Warecnt shopLeft">
- <div class="LeftAsse">
- <div class="LeftAssetop">
- <span><img src="../img/glR.gif" /></span>
- <img src="../img/glL.gif" width="34" height="24" />
- </div>
- <div class="LeftAssecnt">
- <div class="LeftAsseText">
- <div class="LeftAsseTextT" style=" margin-top:18px; text-align:center; color:#ff0000;">
- <?php
- if(!empty($score_t)){
- echo "恭喜 您的充值已成功!充值金额".$score_t;
- }else{
- echo "充值异常:(";
- }
- ?>
- </div>
- </div> </div> </div> </div> </div> </div>
- </body>
- </html>
广州网站设计
这里,同样可以通过链接的方式,模拟服务期间通知的模式来验证程序,模拟用的链接地址如下:- http://localhost/payment/PortSample/GetPayHandle.php?c_mid= 1033562&c_order=20100619&c_orderamount=18&c_ymd=20100530&c_transnum= &c_succmark=Y&c_moneytype=0&c_signstr=6f1ac09398f03c48749a0e38d872fcd8&c_memo1=10.32&c_memo2=12345
![]() |
| 图12.4 充值结果页面 |




