网银在线的异步操作代码示意图
2015-07-28 15:25
447 查看
1.关于异步反馈的操作,之所以需要这个,是因为有时候,如果用户使用的时候突然断网了或者什么的,就不会导致数据异常,没有反馈到成功的信息。
所以需要异步这个操作。
如果正常的情况下,是走同步的流程的,然后网银那边会每隔三分钟左右反馈一个异步的请求,只有反馈值为true的话才会修改订单信息,基本的值和同步都是差不多的。
2.对写的的操作进行学习。
①在main.php文件里面,配置一个异步返回的路径
②在UnionpayProxy.php文件夹下,在原来的基础上加入异步通知的url,然后初始化给remark2字段。
③在UnionPayService页面里面,对remark2字段进行单独的初始化,如果有的话,就是
要加入以上的字段,url那里要加上中括号,一定要按照上述的格式进行赋值
④在我对应异步通知的目录下加入一个对应的方法,具体写法和同步的相同
/**
* 银联异步 返回显示页面
* @desc 异步通知支付【对账单】
* @return boolean
* @author xcz <2015-7-28>
*
*/
function actionUnionpayNoticeReturn(){
$unionpay = Yii::app()->unionpay;
}
⑤在对应的地方加入
所以需要异步这个操作。
如果正常的情况下,是走同步的流程的,然后网银那边会每隔三分钟左右反馈一个异步的请求,只有反馈值为true的话才会修改订单信息,基本的值和同步都是差不多的。
2.对写的的操作进行学习。
①在main.php文件里面,配置一个异步返回的路径
②在UnionpayProxy.php文件夹下,在原来的基础上加入异步通知的url,然后初始化给remark2字段。
③在UnionPayService页面里面,对remark2字段进行单独的初始化,如果有的话,就是
if($key == 'remark2'){ //在remark2这个字段配置一个异步通知的url注意在value里面要加上中括号 $sHtml.='<input type="hidden" name="remark2" value="[url:='.$val.']">'; }
要加入以上的字段,url那里要加上中括号,一定要按照上述的格式进行赋值
④在我对应异步通知的目录下加入一个对应的方法,具体写法和同步的相同
/**
* 银联异步 返回显示页面
* @desc 异步通知支付【对账单】
* @return boolean
* @author xcz <2015-7-28>
*
*/
function actionUnionpayNoticeReturn(){
$unionpay = Yii::app()->unionpay;
//FunctionHelper::sendMail("1598135958@qq.com","粽子测试","粽子测试",print_r($_POST,true)); //exit; $key = 'joyowoyaobaohuhao990';//登陆后在上面的导航栏里可能找到“资料管理”,在资料管理的二级导航栏里有“MD5密钥设置” $return_array = $_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 //拼凑后的MD5校验值 $v_md5str = trim($_POST['v_md5str']); $v_moneytype = trim($_POST['v_moneytype']); //重新计算md5的值 $md5string = strtoupper(md5($v_oid . $v_pstatus . $v_amount . $v_moneytype . $key)); //判断返回信息,如果支付成功,并且支付结果可信,则做进一步的处理 if ($v_md5str == $md5string) { //支付状态 :20(支付成功); //30(支付失败) //支付成功,可进行逻辑处理! //商户系统的逻辑处理(例如判断金额,判断支付状态,更新订单状态等等)......; 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 (); } Yii::app()->SSOClient->refreshLoginInfo(); Yii::app()->SSOClient->getLoginInfo(); return true; }else{ return false; } exit (); }
}
⑤在对应的地方加入
相关文章推荐
- php解析一个url
- Spring DI 集合属性依赖注入
- [LeetCode] Simplify Path
- 比较Java Swing中三种注册事件的方法
- 常用正则表达式 -- 费元星 java大神
- Java中面向对象的详解
- Java学习笔记3:Java编程中字符串的处理
- Spring DI 属性注入深入——P名称空间和spEL表达式
- C#、SQL中的事务
- C++中的覆盖、重载与隐藏
- C++ STL 迭代器方法 之 advance与prev 方法 浅析
- java接口应用—策略设计模式
- C++ STL 之 next_permutation 的用法(下一个序列函数,按字典序排)
- php 如何解决“您访问的域名有误或网页不存在”
- C++学习之深入理解虚函数--虚函数表解析
- javaWeb中的no result问题
- java选择排序
- Java中二维数组与面向对象
- Spring IOC容器
- 树莓派(raspberry)能利用IP查主机名?