zoukankan      html  css  js  c++  java
  • PHP22 PHP在线支付

    易宝支付示例脚本

    参考网址:https://blog.csdn.net/yerenyuan_pku/article/details/52239862

    参数说明

    • p1_MerId:商户编号,网站在易宝上申请一个账号时,易宝支付系统为商户分配的唯一身份标识。
    • p8_Url(此参数是非常重要的):该响应地址就是支付流程图中第14步的那个地址,是由易宝给用户的,通知网站是否支付成功。
    • pd_FrpId:即支付通道编码,用户向易宝发送请求时,告诉易宝找哪个银行去支付。
    • pr_NeedResponse:即应答机制。

    应答机制

    用户通过网站发支付请求,网站让用户去找易宝,如果用户在易宝那端支付成功,那这时易宝要通知网站支付成功,易宝怎么去通知网站是否支付成功呢?

    答:易宝都是要用户浏览器去重定向到网站上面去,在重定向的时候后面跟一个消息,即是否支付成功。

    那么就会出现一个问题:如果只是采用这种模型来通知网站是否支付成功,这是有问题的,你让用户浏览器重定向,用户浏览器恰恰坏了,那就无法重定向到网站,通知网站是否支付成功。这时无法把订单置为true,即用户就没有支付。那又改怎么去解决这个问题呢?

    答:易宝采用了一种比较稳妥的方法,它收到支付成功的消息后,它会让用户浏览器去重定向到网站上面去,以通知网站是否支付成功。除此之外,它自己还会向在线支付请求参数中的p8_Url所代表的servlet发请求,它一直发,直到网站给易宝返回success为止,易宝收到success,它就认为网站收到了支付成功的消息,如果易宝向网站发请求,网站没有给他返回success,它就认为网站没收到支付成功的消息,它会不停地向网站发,一直到网站收到为止。

    hmac,即hmac码。该hmac码是由网站通过以上易宝需要的支付请求参数和密钥(网站在易宝上申请一个账号时,易宝支付系统为每个申请者分配的唯一密钥)混在一起,经由MD5算法生成的。

    支付请求页面index.html

    <html>
    <head>
        <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
    </head>
    <form action="payConfirm.php" method="post">
        <table>
            <tr>
                <td colspan="4">
                    订单号:<input type="text" name="p2_Order"/>
                    支付金额:<input type="text" name="p3_Amt"/></td>
            </tr>
            <tr><td colspan="4">请选择支付银行</td></tr>
            <tr>
                <td><input type="radio"name="pd_FrpId" value="CMBCHINA-NET"/>招商银行</td>
                <td><input type="radio"name="pd_FrpId" value="ICBC-NET"/>工商银行</td>
                <td><input type="radio"name="pd_FrpId" value="ABC-NET"/>农业银行</td>
                <td><input type="radio"name="pd_FrpId" value="CCB-NET"/>建设银行</td>
            </tr>
            <tr>
                <td colspan="4"><input type="submit" value="确认支付"/></td>
            </tr>
        </table>
    </form>
    

      

    确认支付数据处理payConfirm.php

    <html>
    <head>
        <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    </head>
    <?php
    include 'common.php';
    
    $p0_Cmd = "Buy";//业务类型
    $p1_MerId = "10001126856";//商户编号(测试账号)
    $p2_Order = $_REQUEST['p2_Order'];//获取用户提交表单中的订单编号
    $p3_Amt = $_REQUEST['p3_Amt'];//订单金额
    $p4_Cur = "CNY";//交易币种,固定值是'CNY' 人民币
    
    $p5_Pid = "";// 商品名称
    $p6_Pcat = ""; // 商品种类
    $p7_Pdesc = ""; // 商品介绍
    
    
    $p8_Url = "http://loaclhost/mythinkphp/pay/res.php";//易宝支付成功后,返回信息到此url
    $p9_SAF = "0"; // 送货地址
    $pa_MP = ""; // 商品扩展信息
    $pd_FrpId = $_REQUEST['pd_FrpId']; // 银行支付通道
    $pr_NeedResponse = "1"; // 应答机制
    // 我们把请求参数一个一个拼接(拼接的时候,顺序很重要!!)
    $data="";
    $data=$data.$p0_Cmd;
    $data=$data.$p1_MerId;
    $data=$data.$p2_Order;
    $data=$data.$p3_Amt;
    $data=$data.$p4_Cur;
    $data=$data.$p5_Pid;
    $data=$data.$p6_Pcat;
    $data=$data.$p7_Pdesc;
    $data=$data.$p8_Url;
    $data=$data.$p9_SAF;
    $data=$data.$pa_MP;
    $data=$data.$pd_FrpId;
    $data=$data.$pr_NeedResponse;
    
    $merchantKey ="69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl";
    // hmac签名串,是用于易宝和商家互相确认的关键字
    $hmac = HmacMd5($data,$merchantKey);
    
    ?>
    你的订单号是:<?php echo $p2_Order;  ?>支付的金额是<?php echo $p3_Amt; ?>
    <!-- 把要提交的数据用隐藏域表示 -->
    <form action="https://www.yeepay.com/app-merchant-proxy/node" method="post">
        <input type="hidden" name="p0_Cmd" value="<?php echo $p0_Cmd; ?>"/>
        <input type="hidden" name="p1_MerId" value="<?php echo $p1_MerId; ?>"/>
        <input type="hidden" name="p2_Order" value="<?php echo $p2_Order; ?>"/>
        <input type="hidden" name="p3_Amt" value="<?php echo $p3_Amt; ?>"/>
        <input type="hidden" name="p4_Cur" value="<?php echo $p4_Cur; ?>"/>
        <input type="hidden" name="p5_Pid" value="<?php echo $p5_Pid; ?>"/>
        <input type="hidden" name="p6_Pcat" value="<?php echo $p6_Pcat; ?>"/>
        <input type="hidden" name="p7_Pdesc" value="<?php echo $p7_Pdesc; ?>"/>
        <input type="hidden" name="p8_Url" value="<?php echo $p8_Url; ?>"/>
        <input type="hidden" name="p9_SAF" value="<?php echo $p9_SAF; ?>"/>
        <input type="hidden" name="pa_MP" value="<?php echo $pa_MP; ?>"/>
        <input type="hidden" name="pd_FrpId" value="<?php echo $pd_FrpId; ?>"/>
        <input type="hidden" name="pr_NeedResponse" value="<?php echo $pr_NeedResponse; ?>"/>
        <input type="hidden" name="hmac" value="<?php echo $hmac; ?>"/>
        <input type="submit" value="确认网上支付"/>
    </form>
    </html>
    

      

    支付加密common.php文件

    <?php
    function HmacMd5($data, $key)
    {
        //需要配置环境支撑iconv,否则中文参数不能正常处理
        $key = iconv("GB2312", "UTF-8", $key);
        $data = iconv("GB2312", "UTF-8", $data);
        $b = 64;
        if (strlen($key) > $b) {
            $key = pack("H*", md5($key));
        }
        $key = str_pad($key, $b, chr(0x00));
        $ipad = str_pad('', $b, chr(0x36));
        $opad = str_pad('', $b, chr(0x5c));
        $k_ipad = $key ^ $ipad;
        $k_opad = $key ^ $opad;
        return md5($k_opad . pack("H*", md5($k_ipad . $data)));
    }
    //我们把易宝支付要求生成一个签名串
    //把各个请求参数凭借作为$data传入: $key 就是易宝给商家分配的密钥
    

        

    支付响应信息处理页面payres.php

    <?php
    include 'common.php';
    //获取从易宝支付网关返回的信息
    $p1_MerId = "10001126856";
    $r0_Cmd = $_REQUEST['r0_Cmd'];
    $r1_Code = $_REQUEST['r1_Code'];
    $r2_TrxId = $_REQUEST['r2_TrxId'];
    $r3_Amt = $_REQUEST['r3_Amt'];
    $r4_Cur = $_REQUEST['r4_Cur'];
    $r5_Pid = $_REQUEST['r5_Pid'];
    $r6_Order = $_REQUEST['r6_Order'];
    $r7_Uid = $_REQUEST['r7_Uid'];
    $r8_MP = $_REQUEST['r8_MP'];
    $r9_BType = $_REQUEST['r9_BType'];
    $hmac = $_REQUEST['hmac'];
    
    // 拼接
    $res_src = "";
    $res_src = $res_src . $p1_MerId;
    $res_src = $res_src . $r0_Cmd;
    $res_src = $res_src . $r1_Code;
    $res_src = $res_src . $r2_TrxId;
    $res_src = $res_src . $r3_Amt;
    $res_src = $res_src . $r4_Cur;
    $res_src = $res_src . $r5_Pid;
    $res_src = $res_src . $r6_Order;
    $res_src = $res_src . $r7_Uid;
    $res_src = $res_src . $r8_MP;
    $res_src = $res_src . $r9_BType;
    $merchantKey = "69c1522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4P1";
    // 对返回的结果进行MD5-hmac加密处理,和返回的hmac签名串比较
    if (HmacMd5($res_src, $merchantKey) == $hmac) {
        if ($r1_Code == 1) {
            if ($r9_BType == 1) {
                echo '交易成功!';
                echo '订单号为' . $r6_Order . '支付成功!' . '所付金额是' . $r3_Amt . '易宝支付订单号' . $r2_TrxId;
                echo '<br/>浏览器重定向';
            } elseif ($r9_BType == 2) {
                echo 'success';
                echo '<br/>交易成功!';
                echo '<br/>服务器点对点通讯';
            }
        }
    } else {
        echo '签名被篡改了';
    }
    
    ?>
    

      

    MVC框架中实现支付

    定义支付视图

     

    index.html请求支付视图

    <html>
    <head>
        <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
    </head>
    
    <body>
    
    <form action="index.php?g=home&c=pay&a=payconfirm" method="post">
        <table>
            <tr>
                <td colspan="4">
                    订单号:<input type="text" name="p2_Order"/>
                    支付金额:<input type="text" name="p3_Amt"/></td>
            </tr>
            <tr>
                <td colspan="4">请选择支付银行</td>
            </tr>
            <tr>
                <td><input type="radio" name="pd_FrpId" value="CMBCHINA-NET"/>招商银行</td>
                <td><input type="radio" name="pd_FrpId" value="ICBC-NET"/>工商银行</td>
                <td><input type="radio" name="pd_FrpId" value="ABC-NET"/>农业银行</td>
                <td><input type="radio" name="pd_FrpId" value="CCB-NET"/>建设银行</td>
            </tr>
            <tr>
                <td colspan="4"><input type="submit" value="确认支付"/></td>
            </tr>
        </table>
    </form>
    
    </body>
    
    </html>
    

      

    payconfirm.html确认支付视图

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    你的订单号是:<?php echo $this->data['p2_Order'];  ?>支付的金额是<?php echo  $this->data['p3_Amt']; ?>
    <!-- 把要提交的数据用隐藏域表示 -->
    <form action="https://www.yeepay.com/app-merchant-proxy/node" method="post">
        <input type="hidden" name="p0_Cmd" value="<?php echo  $this->data['p0_Cmd']; ?>"/>
        <input type="hidden" name="p1_MerId" value="<?php echo  $this->data['p1_MerId']; ?>"/>
        <input type="hidden" name="p2_Order" value="<?php echo  $this->data['p2_Order']; ?>"/>
        <input type="hidden" name="p3_Amt" value="<?php echo  $this->data['p3_Amt']; ?>"/>
        <input type="hidden" name="p4_Cur" value="<?php echo  $this->data['p4_Cur']; ?>"/>
        <input type="hidden" name="p5_Pid" value="<?php echo  $this->data['p5_Pid']; ?>"/>
        <input type="hidden" name="p6_Pcat" value="<?php echo  $this->data['p6_Pcat']; ?>"/>
        <input type="hidden" name="p7_Pdesc" value="<?php echo  $this->data['p7_Pdesc']; ?>"/>
        <input type="hidden" name="p8_Url" value="<?php echo  $this->data['p8_Url']; ?>"/>
        <input type="hidden" name="p9_SAF" value="<?php echo  $this->data['p9_SAF']; ?>"/>
        <input type="hidden" name="pa_MP" value="<?php echo  $this->data['pa_MP']; ?>"/>
        <input type="hidden" name="pd_FrpId" value="<?php echo  $this->data['pd_FrpId']; ?>"/>
        <input type="hidden" name="pr_NeedResponse" value="<?php echo  $this->data['pr_NeedResponse']; ?>"/>
        <input type="hidden" name="hmac" value="<?php echo  $this->data['hmac']; ?>"/>
        <input type="submit" value="确认网上支付"/>
    </form>
    </body>
    </html>
    

      

    控制器设计

     

    关键代码

    <?php
    /**
     * Created by PhpStorm.
     * User: Administrator
     * Date: 2018/7/12
     * Time: 10:00
     */
    
    namespace applicationhomecontrollers;
    
    
    use coremybaseController;
    use corePayMD5;
    
    class PayController extends Controller
    {
        /**支付页面*/
        public function index()
        {
            $this->display();
        }
    
        /**确认支付*/
        public function payconfirm()
        {
    
    
            $p0_Cmd = "Buy";//业务类型
            $p1_MerId = "10001126856";//商户编号(测试账号)
            $p2_Order = $_REQUEST['p2_Order'];//获取用户提交表单中的订单编号
            $p3_Amt = $_REQUEST['p3_Amt'];//订单金额
            $p4_Cur = "CNY";//交易币种,固定值是'CNY' 人民币
            $p5_Pid = "";// 商品名称
            $p6_Pcat = ""; // 商品种类
            $p7_Pdesc = ""; // 商品介绍
            $p8_Url = "http://loaclhost/MyMVC1.0/index.php?g=home&c=pay&a=payres";//易宝支付成功后,返回信息到此url
            $p9_SAF = "0"; // 送货地址
            $pa_MP = ""; // 商品扩展信息
            $pd_FrpId = $_REQUEST['pd_FrpId']; // 银行支付通道
            $pr_NeedResponse = "1"; // 应答机制
            // 我们把请求参数一个一个拼接(拼接的时候,顺序很重要!!)
            $data = "";
            $data = $data . $p0_Cmd;
            $data = $data . $p1_MerId;
            $data = $data . $p2_Order;
            $data = $data . $p3_Amt;
            $data = $data . $p4_Cur;
            $data = $data . $p5_Pid;
            $data = $data . $p6_Pcat;
            $data = $data . $p7_Pdesc;
            $data = $data . $p8_Url;
            $data = $data . $p9_SAF;
            $data = $data . $pa_MP;
            $data = $data . $pd_FrpId;
            $data = $data . $pr_NeedResponse;
            $merchantKey = "69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl";// hmac签名串,是用于易宝和商家互相确认的关键字
            //$hmac = HmacMd5($data,$merchantKey);
            $payMD5 = new PayMD5();
            $hmac = $payMD5->HmacMd5($data, $merchantKey);
    
            $this->assign("p0_Cmd", $p0_Cmd);
            $this->assign("p1_MerId", $p1_MerId);
            $this->assign("p2_Order", $p2_Order);
            $this->assign("p3_Amt", $p3_Amt);
            $this->assign("p4_Cur", $p4_Cur);
            $this->assign("p5_Pid", $p5_Pid);
            $this->assign("p6_Pcat", $p6_Pcat);
            $this->assign("p7_Pdesc", $p7_Pdesc);
            $this->assign("p8_Url", $p8_Url);
            $this->assign("p9_SAF", $p9_SAF);
            $this->assign("pa_MP", $pa_MP);
            $this->assign("pd_FrpId", $pd_FrpId);
            $this->assign("pr_NeedResponse", $pr_NeedResponse);
            $this->assign("hmac", $hmac);
    
            $this->display();
    
        }
    
        /**接收支付结果消息*/
        public function payres()
        {
    
            //获取从易宝支付网关返回的信息
            $p1_MerId = "10001126856";
            $r0_Cmd = $_REQUEST['r0_Cmd'];
            $r1_Code = $_REQUEST['r1_Code'];
            $r2_TrxId = $_REQUEST['r2_TrxId'];
            $r3_Amt = $_REQUEST['r3_Amt'];
            $r4_Cur = $_REQUEST['r4_Cur'];
            $r5_Pid = $_REQUEST['r5_Pid'];
            $r6_Order = $_REQUEST['r6_Order'];
            $r7_Uid = $_REQUEST['r7_Uid'];
            $r8_MP = $_REQUEST['r8_MP'];
            $r9_BType = $_REQUEST['r9_BType'];
            $hmac = $_REQUEST['hmac'];
    
            // 拼接
            $res_src = "";
            $res_src = $res_src . $p1_MerId;
            $res_src = $res_src . $r0_Cmd;
            $res_src = $res_src . $r1_Code;
            $res_src = $res_src . $r2_TrxId;
            $res_src = $res_src . $r3_Amt;
            $res_src = $res_src . $r4_Cur;
            $res_src = $res_src . $r5_Pid;
            $res_src = $res_src . $r6_Order;
            $res_src = $res_src . $r7_Uid;
            $res_src = $res_src . $r8_MP;
            $res_src = $res_src . $r9_BType;
    
            $merchantKey = "69c1522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4P1";
    
            // 对返回的结果进行MD5-hmac加密处理,和返回的hmac签名串比较
            $payMD5 = new PayMD5();
            if ($payMD5->HmacMd5($res_src, $merchantKey) == $hmac) {
                if ($r1_Code == 1) {
                    if ($r9_BType == 1) {
                        echo '交易成功!';
                        echo '订单号为' . $r6_Order . '支付成功!' . '所付金额是' . $r3_Amt . '易宝支付订单号' . $r2_TrxId;
                        echo '<br/>浏览器重定向';
                    } elseif ($r9_BType == 2) {
    
                        //修改订单状态
    
                        echo 'success';
                        echo '<br/>交易成功!';
                        echo '<br/>服务器点对点通讯';
                    }
                }
            } else {
                echo '签名被篡改了';
            }
        }
    }
    

      

      



    本博客文章未经许可,禁止转载和商业用途!

    如有疑问,请联系: 2083967667@qq.com


  • 相关阅读:
    WebMatrix简介与预览
    使用NuGet增加常见包引用
    用Jquery实现的一个Table的帮助js
    使用AspNetPager进行存储过程分页
    Android之旅AppWidget
    SQL积累
    【问题记录】Asp.net WebApplication和WebSite中用户控件的使用区别
    ActionScript 3.0工厂模式实例
    ActionScript 3.0 实现单态模式
    装饰器模式小结
  • 原文地址:https://www.cnblogs.com/rask/p/9299794.html
Copyright © 2011-2022 走看看