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