首页 > 其他 > 详细

网银接口的代码编写总结

时间:2015-06-01 22:47:35      阅读:327      评论:0      收藏:0      [点我收藏+]

首先,网银接口的话,需要去申请,申请后会提供三个文件的php版本的例子。
autoReceives是表示自动对账。暂时我没有使用到。剩下的两个文件,一个是发送的模板,一个是接收到的页面的模板。
拿到接口后,需要先对这几个文件进行配置和测试,对这几个文件里面的商家号和key的值进行替换。
D:\Newjoyowo\trunk\trunk\aaaa\chinabank 放在这个目录下 然后http://local.jysocial.dev/aaaa/index.html
提供的接口只要输入对应的key和商户名就好了
把chinabank logo chinabank.html(名字改成index.php)放到那个目录即可

根据自己的网站的情况。首先找到付款页面所在的地方。

首先,在扩展里面,添加上/protected/extensions/unionpay这个文件夹。这个文件夹对应的信息,得现在main.php这个配置文件里面进行配置。首先在import那个数组里面,加上 ‘application.extensions.unionpay.*’,

这样一句话,表示将unionpay这个扩展文件夹下的所有文件都引入系统。
再然后配置unionpay这个的信息,第一个class表示new unionpay这个extension的时候,要调用的文件的目录。然后key表示密码,mid表示商家号,这两个都是要去网银那里申请的。最后那个v_url表示你支付完后跳转回来的路径,是绝对路径,注意,在本地,测试和线上的时候,一定要记得修改这个的配置。

‘unionpay‘=>array(
            ‘class‘=>‘application.extensions.unionpay.UnionpayProxy‘,
            ‘key‘=> ‘joyowoyaobaohuhao990‘,
            ‘v_url‘=>‘http://test.joyowo.com/hrms/order/unionpayreturn‘,
            ‘v_mid‘=>‘23221599‘,
        ),

然后根据从支付宝那里学到的知识,创建几个我们需要的文件。
/protected/extensions/unionpay/UnionpayProxy.php //这个类是网银支付的类,里面对我在mian.php那个文件夹里面配置的信息进行了初始化,然后还提供一个bindform的方法,用来进行表单提交,然后转移到网银支付的界面。

<?php


class UnionpayProxy extends CComponent
{
    public $v_oid = "";
    public $key = "";
    public $v_url = "";
    public $v_mid = "";
    public function init() {
        Yii::import(‘application.extensions.unionpay.class.*‘);
    }

    public function buildForm($request) {
        $params = array(
            ‘v_oid‘=> $this->v_oid,
            ‘key‘ => $this->key,
            ‘v_url‘ => $this->v_url,
            ‘v_mid‘  =>  $this->v_mid,
        );
        $params = array_merge($params, $request->getParams());
        $params = $this->para_filter($params);
        $service = new UnionpayService($params);
        return $service->build_form();
    }

    /**除去数组中的空值和签名参数
     *$parameter 签名参数组
     *return 去掉空值与签名参数后的新签名参数组
     */
    public function para_filter($parameter) {
        $para = array();
        while (list ($key, $val) = each ($parameter)) {
            if($key == "sign" || $key == "sign_type" || $val == "")continue;
            else    $para[$key] = $parameter[$key];
        }
        return $para;
    }

}

/trunk/trunk/protected/extensions/unionpay/class // 文件夹
/trunk/trunk/protected/extensions/unionpay/class/UnionpayDirectRequest.php //这个是用来将网银支付的表单所需要的值的初始化赋值:这样我在之后调用的时候,就只需要对这个request进行初始化就好了。

<?php
class UnionpayDirectRequest
{
//    private $service = "create_direct_pay_by_user";
//    private $payment_type = "1";

    public $v_oid = "";
    public $v_amount = "";
    public $remark1 = "";
    public $remark2 = "";
    public $v_rcvname = "";
    public $v_rcvaddr = "";
    public $v_rcvtel = "";
    public $v_rcvpost = "";
    public $v_rcvemail = "";
    public $v_rcvmobile = "";

    public $v_ordername = "";
    public $v_moneytype = "";
    public $v_orderaddr = "";
    public $v_ordertel = "";
    public $v_orderpost = "";
    public $v_orderemail = "";
    public $v_ordermobile = "";
    public $key = "";
    public $v_url = "";
    public $v_mid = "";

    public function getParams() {
        return array(
            ‘v_oid‘=>$this->v_oid,
            ‘v_amount‘=>$this->v_amount,
            ‘remark1‘=>$this->remark1,
            ‘remark2‘=>$this->remark2,
            ‘v_moneytype‘=>$this->v_moneytype,
            ‘v_rcvname‘=>$this->v_rcvname,
            ‘v_rcvaddr‘=>$this->v_rcvaddr,
            ‘v_rcvtel‘=>$this->v_rcvtel,
            ‘v_rcvpost‘=>$this->v_rcvpost,
            ‘v_rcvemail‘=>$this->v_rcvemail,
            ‘v_rcvmobile‘=>$this->v_rcvmobile,
            ‘v_ordername‘=>$this->v_ordername,
            ‘v_orderaddr‘=>$this->v_orderaddr,
            ‘v_ordertel‘=>$this->v_ordertel,
            ‘v_orderpost‘=>$this->v_orderpost,
            ‘$v_orderemail‘=>$this->v_orderemail,
            ‘v_ordermobile‘=>$this->v_ordermobile,
            ‘key‘=>$this->key,
            ‘v_url‘=>$this->v_url,
            ‘v_mid‘=>$this->v_mid,
        );
    }
}

/trunk/trunk/protected/extensions/unionpay/class/UnionpayService.php
//这个表示对将之前那个request的数据通过form表单的形式,然后post的方法,传递给网银的那个接口。

<?php

class UnionpayService {

    public function __construct($parameter) {
        $this->parameter = $parameter;
    }

    /********************************************************************************/

    /**构造表单提交HTML
    *return 表单提交HTML文本
     */
    function build_form() {
//      //POST方式传递
        $text = $this->parameter[‘v_amount‘].$this->parameter[‘v_moneytype‘].$this->parameter[‘v_oid‘].$this->parameter[‘v_mid‘].$this->parameter[‘v_url‘].$this->parameter[‘key‘];        //md5加密拼凑串,注意顺序不能变
        $v_md5info = strtoupper(md5($text));                             //md5函数加密并转化成大写字母
        $this->parameter[‘v_md5info‘] = $v_md5info;
        $sHtml = ‘<form method="post" name="E_FORM" action="https://pay3.chinabank.com.cn/PayGate">‘;
        while (list ($key, $val) = each ($this->parameter)) {
            if(isset($val)) {
                $sHtml.= "<input type=‘hidden‘ name=‘".$key."‘ value=‘".$val."‘/>";
            }
        }

        //submit按钮控件请不要含有name属性
        $sHtml = $sHtml."<input type=‘submit‘ value=‘网银确认付款‘ style=‘display:none;‘></form>";
        $sHtml = $sHtml."<script>javascript:document.E_FORM.submit();</script>";

        return $sHtml;
    }
    /********************************************************************************/

}
?>

这样就将unionpay这个扩展给初始化了。在unionservice这个里面的build_form的方法,就是对send.php里面的form表单的整合,注意$v_md5info这个的信息一定要加上去。然后,通过” 这个js的方法来自动触发post提交表单,E_FORM 这个表示form的name属性,是可以修改的。
以上这些都是整合好的方法,需要系统的对其进行调用。而对于我的系统,我适用的是order这个控制器,然后调用的是actionPayment这个方法。
对应的代码段如下。

elseif($pay_method == ‘unionpay‘){//网银支付
            $unionpay = Yii::app()->unionpay; //首先,初始化$unionpay这个类。会去调用配置的UnionpayProxy这个文件,然后返回一个对象

            $request = new UnionpayDirectRequest(); //初始化请求,对需要的请求的数据进行初始化
            $order_array = $order->attributes; //获取对应的订单。
            if((isset($order_array[‘order_code‘])))        //判断是否有传递订单号
            {
                $request->v_oid = $order_array[‘order_code‘];
            }
            else
            {
                $request->v_oid = date(‘Ymd‘,time())."-".$request[‘v_mid‘]."-".date(‘His‘,time());
//订单号,建议构成格式 年月日-商户号-小时分钟秒

            }
            $request->v_oid = $order_array[‘order_code‘];;
            $request->v_amount = $order_array[‘order_money‘];
            $request->v_moneytype = ‘CNY‘;
            $request->key = $unionpay->key;
            $request->v_url = $unionpay->v_url;
            $request->v_mid = $unionpay->v_mid;
//上面的步骤就是将$request对应的信息进行赋值。

            $form = $unionpay->buildForm($request); //因为对UnionpayProxy进行了初始化,所以会有buildForm这个方法,然后这个方法会去调用service里面的build_Form的方法。
            echo $form;
//表单会自动提交,最后,跳转到网银那里去了。
            die();
        }

②对receive.php的文件进行修改
这个文件对应的内容表达的就是,你在网银付款结束后,网银会根据你配置的v_url给你进行跳转,对这个文件进行修改额,需要根据这个v_url的值,去对应的控制器写对应的方法,比如,我之前配置的信息为。’v_url’=>’http://test.joyowo.com/hrms/order/unionpayreturn‘,
然后需要去order这个控制器里面,写上unionpayreturn这个方法。

/**
    * 银联返回显示页面
    * @author xcz <2015-6-1>
    */
public function actionUnionpayReturn()
{
    $unionpay = Yii::app()->unionpay;
    $key = ‘joyowoyaobaohuhao990‘;                            //登陆后在上面的导航栏里可能找到“资料管理”,在资料管理的二级导航栏里有“MD5密钥设置”


    $return_array = $_POST;
//因为是通过$_POST发过去的。所以网银发回来的时候,也是通过POST的方法。$_POST能获取返回回来的所有的值。

    $v_oid = trim($_POST[‘v_oid‘]);       // 商户发送的v_oid定单编号
    $v_pmode = trim($_POST[‘v_pmode‘]);    // 支付方式(字符串)
    $v_pstatus = trim($_POST[‘v_pstatus‘]);   //  支付状态 :20(支付成功);30(支付失败)
    $v_pstring = trim($_POST[‘v_pstring‘]);   // 支付结果信息 : 支付完成(当v_pstatus=20时);失败原因(当v_pstatus=30时,字符串);
    $v_amount = trim($_POST[‘v_amount‘]);     // 订单实际支付金额
    $remark1 = trim($_POST[‘remark1‘]);      //备注字段1
    $remark2 = trim($_POST[‘remark2‘]);     //备注字段2
    $v_md5str = trim($_POST[‘v_md5str‘]);   //拼凑后的MD5校验值
    $v_moneytype = trim($_POST[‘v_moneytype‘]);

//重新计算md5的值,然后和返回的MD5的值进行比对,如果一样就表示成功。
    $md5string = strtoupper(md5($v_oid . $v_pstatus . $v_amount . $v_moneytype . $key));

    /**
        * 判断返回信息,如果支付成功,并且支付结果可信,则做进一步的处理
        */


    if ($v_md5str == $md5string) {
        if ($v_pstatus == 20) {
            //  支付状态 :20(支付成功);30(支付失败)
            //支付成功,可进行逻辑处理!
            //商户系统的逻辑处理(例如判断金额,判断支付状态,更新订单状态等等)......;
            $order = array();
            $order = OrderModel::model()->find(‘order_code=:order_code‘, array(‘order_code‘ => $v_oid));

            $transaction = Yii::app ()->db->beginTransaction ();
            try {
                OrderModel::model()->updateOrderStatus($v_oid,$v_amount,OrderModel::SERVICECOMPLET);
                $order_social_detail_model = OrderSocialDetailModel::model()->findAll(‘order_id=‘.$v_oid);
                if(!empty($order_social_detail_model)){
                    foreach ($order_social_detail_model as $value) {
                        $value->pay_status = 1;
                        $value->paid_status = 1;
                        $value->paid_time = date(‘Y-m-d H:i:s‘,time());
                        $value->service_status = 3;
                        $value->pay_time =  date(‘Y-m-d H:i:s‘,time());
                        $value->update();
                    }
                }
                $transaction->commit ();
            } catch ( Exception $e ) {
                $transaction->rollback (); // 如果操作失败, 数据回滚
            }
            $status =  ‘success‘;

        } else {
            $status = ‘fail‘;
        }

        $this->render(‘order_paid‘, array(
        ‘status‘ => $status,
        ‘order‘ => $order,
        ‘payment_account‘ => ‘‘
        ));
        exit ();
    }
}

在判断成功的地方,进行修改数据库操作。
然后将数据渲染到order_paid这个view的地方。

网银接口的代码编写总结

原文:http://blog.csdn.net/rodgexue/article/details/46314623

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!