网银接口的代码编写总结

首先,网银接口的话,需要去申请,申请后会提供三个文件的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的地方。

时间: 2025-01-09 17:00:15

网银接口的代码编写总结的相关文章

大师传承-java代码编写的30条建议

成为一个优秀的Java程序员,有着良好的代码编写习惯是必不可少的.下面就让我们来看看代码编写的30条建议吧. (1) 类名首字母应该大写.字段.方法以及对象(句柄)的首字母应小写.对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母.例如: ThisIsAClassName thisIsMethodOrFieldName 若在定义中出现了常数初始化字符,则大写static final基本类型标识符中的所有字母.这样便可标志出它们属于编译期的常数. Java包(Package

JAVA代码编写的30条建议

列举了大量有用的建议,帮助大家进行低级程序设计,并提供了代码编写的一般性指导: (1) 类名首字母应该大写.字段.方法以及对象(句柄)的首字母应小写.对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母.例如: ThisIsAClassName thisIsMethodOrFieldName 若在定义中出现了常数初始化字符,则大写static final基本类型标识符中的所有字母.这样便可标志出它们属于编译期的常数. Java包(Package)属于一种特殊情况:它们全都是

七牛云存储android客户端及java服务端代码编写

前一篇博客提到让我很伤心的c应用,由于是一款供用户上传图片的应用,因此必须解决图片存储问题,如果直接将图片存储至服务器,当用户上传图片较多,服务器空间将很快吃紧,同时也没有那么大的带宽,现实中我买的阿里云服务器是最低配置,数据盘才20G,带宽才1M,如果用这样配置的服务器做图片存储,那实在太扯了.于是很自然的想到用图片云存储服务器,通过不断查找资料,最后将目标定位在七牛云和又拍云.在做选择时,主要对比了两者之间的价格及技术优势,也看了很多相关话题讨论,个人认为这两者无论从技术方案还是产品价格,都

Python——类代码编写细节

类代码编写细节 继续学习类.方法和继承. ================================================================================ class语句 以下是class语句的一般形式: class <name>(superclass,...): data = value def method(self,...): self.member = value 在class语句内,任何赋值语句都会产生类属性,而且还有特殊名称方法重载运

wp8人人监督app开发历程 - (前期调研 &gt; app策划 &gt; 代码编写 &gt;测试 &gt; 上架到商店)

前言 一直想为社会做一点事情,却一直都不知道做什么,策划已久的"人人监督"app终于做了一小半了. 开发了好几款app了,一直没写博文记录在开发app中遇到的问题和技术,这次"人人监督"不能在错过了,一定要坚持把整个开发历程写下来,同大家分享在代码世界中的快乐. "人人监督" 是一款供民众投诉.检举.监督的一款app,其目的是人人监督以营造和谐的社会! 项目技术 开发环境:Windows8  + Visual Studio 2012 + SQl

Qt CS架构 客户端代码编写技巧 QTcpSocket

QT网络编程解说 QTcpSocket网络编程细节 QT网络编程解说 很多人在编写网络代码的时候,客户端代码编写的功能总不能胜任所需要的功能能力,现在我将编写网络代码所需要遵循的规范输出出来,帮助别的人梳理对网络的认识. 连接网络和服务器通信的过程:连接,断开属于开关的时间.中途所有的数据消息都遵循如下过程: 打包数据, 打包消息, 发送消息, 接收消息, 解包消息, 解包数据. 应用对数据进行发送前和接收后的处理. QTcpSocket网络编程细节 qteclientmessage负责将服务器

Java学习---Java代码编写规范

编码规范 1 前言为确保系统源程序可读性,从而增强系统可维护性,java编程人员应具有基本类似的编程风格,兹制定下述Java编程规范,以规范系统Java部分编程.系统继承的其它资源中的源程序也应按此规范作相应修改. 2 适用范围本文档将作为java编程人员软件开发的编程格式规范.在项目Java部分的编码.测试及维护过程中,要求严格遵守. 3 命名规范定义这个规范的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,减少项目组中因为换人而带来的损失. 3.1 Package 的命名Packa

php 代码编写规范

1 编写目的为了更好的提高技术部的工作效率,保证开发的有效性和合理性,并可最大程度的提高程序代码的可读性和可重复利用性,指定此规范.开发团队根据自己的实际情况,可以对本规范进行补充或裁减. 2 整体要求技术部php开发规范将参照PEAR的规范,基本采用PEAR指定的规范,在其基础上增加.修改或删除部分适合具体开发环境的规范.本规范只针对PHP开发过程中编码的规范,对于PHP开发项目中文件.目录.数据库等方面的规范,将不重点涉及.本规范包含了PHP开发时程序编码中命名规范.代码缩进规则.控制结构.

正确理解Java代码编写规范

本文从Java代码编写的初期到结尾,做了一次整体的总结,希望对初学者有帮助. 1.命名很重要 一个错误的命名会很误导人,不良的命名,对于阅读代码的人来说很纠结.一个良好的命名对自己也有很大的帮助. 我个人命名的变量都比较长,一般是单词的全称,这样代码读起来易懂,有些缩写你根本不知道它代表的单词是什么,除了像id代表identifier,org代表organization这些大家常见的缩写命名. 命名一个方法时候,最好能让大家见名知意,看到名字就能猜出你的功能,而不需要去看方法的注释,甚至是读源码