php实现银联商务公众号+服务窗支付的示例代码


Posted in PHP onOctober 12, 2019

之前我们学习了银联商务的H5支付,但是现在H5支付不支持微信支付,最后发现银联商务的公众号+服务窗支付可以支持支付宝支付+微信支付+银联支付

一:接口地址:

测试接口地址:https://qr-test2.chinaums.com/netpay-portal/qmf/webPay.do?

正式接口地址:https://qr.chinaums.com/netpay-portal/qmf/webPay.do?

二:主要参数说明:

接口使用的是get传参,直接将接口参数放到接口地址后,此接口是由浏览器直接跳转到接口

1:instMid

业务类型,直接填入:YUEDANDEFAULT

2:merOrderId

商户订单号

3:mid

银联商务的公众号+服务窗支付产品的商户号

4:msgSrc

消息来源,如:WWW.TEST.COM

5:msgType(这个参数是否重要,主要区分使用什么进行支付)

消息类型:微信支付使用:WXPay.jsPay,支付宝支付使用:trade.jsPay,银联支付使用:qmf.jspay或qmf.webPay

6:orderDesc

订单描述

7:requestTimestamp

报文请求时间,格式为:yyyy-MM-dd HH:mm:ss,如2019-10-01 12:12:12

8:tid

银联商务的公众号+服务窗支付产品的终端号

9:totalAmount

支付总金额,单位为分

10:notifyUrl

支付结果通知地址

11:returnUrl

网页跳转地址

12:sign

签名,将上面的参数按照a-z的顺序进行排序,排序完成之后用&字符连接起来,连接起来之后如果存在转义字符,那么去掉转义字符,然后进行md5加密获取到签名

三:银联商务的公众号+服务窗支付实例:

//测试号相关信息
$mdKey = 'fcAmtnx7MwismjWNhNKdHC44mNXtnEQeJkRrhKJwyrW2ysRR';
$mid = '898340149000005';
$tid = '88880001';
$time = time();
$requestTimestamp = date('Y-m-d H:i:s',$time);
$merOrderId = date('YmdHis') . mt_rand(100000, 999999);
$msgType = 'qmf.jspay';//微信支付:WXPay.jsPay,支付宝支付:trade.jsPay,银联支付:qmf.jspay(qmf.webPay)
$data = [
  'instMid' => 'YUEDANDEFAULT',//业务类型
  'merOrderId' => $merOrderId,//订单号
  'mid' => $mid,//商户号
  'msgSrc' => 'WWW.TEST.COM',//消息来源
  'msgType' => $msgType,//消息类型
  'orderDesc' => '测试',//订单描述
  'requestTimestamp' => $requestTimestamp,//报文请求时间
  'tid' => $tid,//终端号
  'totalAmount' => '1',//支付金额
  'notifyUrl' => 'http://d9vhs4.natappfree.cc',//支付结果通知地址,结果页面会将返回参数通过post传过来。通过status值来判断是否支付成功
  'returnUrl' => 'http://d9vhs4.natappfree.cc',//网页跳转地址,结果页面会将返回参数通过get传过来。通过status值来判断是否支付成功
];
ksort($data);
reset($data);
$options = '';
foreach ($data as $key => $value) {
  $options .= $key . '=' . $value .'&';
}
$options = rtrim($options, '&');
//存在转义字符,那么去掉转义
if(get_magic_quotes_gpc()){
  $options = stripslashes($options);
}
$sign = md5($options . $mdKey);
$options .= '&sign=' . $sign;
$url = 'https://qr-test2.chinaums.com/netpay-portal/webpay/pay.do?'.$options;
//获取到url之后直接跳转即可

支付结束后返回的status参数取值:

php实现银联商务公众号+服务窗支付的示例代码

四:支付退款

既然有支付那么就有退款,那么如何进行退款呢

1:退款接口

测试接口:https://qr-test2.chinaums.com/netpay-route-server/api/

正式接口:https://qr.chinaums.com/netpay-route-server/api/

2:主要参数说明

(1)msgSrc

消息来源,例:WWW.TEST.COM

(2)msgType

消息来源,直接填入:refund

(3)requestTimestamp

报文请求时间,格式为yyyy-MM-dd HH:mm:ss,如:2019-10-01 12:12:12

(4)merOrderId

商户订单号

(5)instMid

业务类型,直接填入YUEDANDEFAULT

(6)mid

银联商务的公众号+服务窗支付产品的商户号

(7)tid

银联商务的公众号+服务窗支付产品的终端号

(8)refundAmount

退款金额,单位为分

(9)refundDesc

退款说明

(10)sign

签名

实现方式同支付中签名相同

五:支付退款实例

//测试号相关信息
$mdKey = 'fcAmtnx7MwismjWNhNKdHC44mNXtnEQeJkRrhKJwyrW2ysRR';
$mid = '898340149000005';
$tid = '88880001';
$requestTimestamp = date('Y-m-d H:i:s',time());
$data = [
  'msgSrc' => 'WWW.TEST.COM',//消息来源
  'msgType' => 'refund',//消息类型
  'requestTimestamp' => $requestTimestamp,//报文请求时间
  'merOrderId' => $merOrderId,//订单号
  'instMid' => $params['instMid'],//业务类型
  'mid' => $mid,//商户号
  'tid' => $tid,//终端号
  'refundAmount' => 1,//退款金额
  'refundDesc' => '测试',//退款说明
];
ksort($data);
reset($data);
$options = '';
foreach ($data as $key => $value) {
  $options .= $key . '=' . $value .'&';
}
$options = rtrim($options, '&');
//存在转义字符,那么去掉转义
if(get_magic_quotes_gpc()){
  $options = stripslashes($options);
}
//签名
$sign = md5($options . $mdKey);
$data['sign'] = $sign;
$client = new Client();
$response = $client->createRequest()
  ->setMethod('POST')
  ->setUrl('https://qr-test2.chinaums.com/netpay-route-server/api/')
  ->setData($data)
  ->setHeaders([
    'Content-Type'=>'application/json'
  ])
  ->setFormat(Client::FORMAT_JSON) //提交的数据的格式
  ->send();
if ($response->isOk) {
  $data = $response->data;
  if ($data['refundStatus'] == 'SUCCESS') {
    //退款成功
    return true;
  }
}
return false;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
用php实现批量查询清除一句话后门的代码
Jan 20 PHP
php正则校验用户名介绍
Jul 19 PHP
php 网页游戏开发入门教程一(webgame+design)
Oct 26 PHP
php从右向左/从左向右截取字符串的实现方法
Nov 28 PHP
遭遇php的in_array低性能问题
Sep 17 PHP
Yii查询生成器(Query Builder)用法实例教程
Sep 04 PHP
Zend Framework过滤器Zend_Filter用法详解
Dec 09 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
Feb 28 PHP
Django中的cookie与session操作实例代码
Aug 17 PHP
php基于Redis消息队列实现的消息推送的方法
Nov 28 PHP
Thinkphp 3.2框架使用Redis的方法详解
Oct 24 PHP
PHP 使用位运算实现四则运算的代码
Mar 09 PHP
Laravel解决nesting level错误和隐藏index.php的问题
Oct 12 #PHP
laravel框架实现去掉URL中index.php的方法
Oct 12 #PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
Oct 12 #PHP
laravel 获取某个查询的查询SQL语句方法
Oct 12 #PHP
php 实现银联商务H5支付的示例代码
Oct 12 #PHP
Thinkphp5.0框架视图view的模板布局用法分析
Oct 12 #PHP
Thinkphp5.0 框架视图view的比较标签用法分析
Oct 12 #PHP
You might like
PHP中字符与字节的区别及字符串与字节转换示例
2016/10/15 PHP
Laravel使用scout集成elasticsearch做全文搜索的实现方法
2018/11/30 PHP
PHP面向对象程序设计继承用法简单示例
2018/12/28 PHP
laravel 出现command not found问题的解决方案
2019/10/23 PHP
JQUERY设置IFRAME的SRC值的代码
2010/11/30 Javascript
DOM 中的事件处理介绍
2012/01/18 Javascript
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
javascript回车完美实现tab切换功能
2014/03/13 Javascript
js实现弹出窗口、页面变成灰色并不可操作的例子分享
2014/05/10 Javascript
alert出数组中的随即值代码
2014/09/25 Javascript
CSS图片响应式 垂直水平居中
2015/08/14 Javascript
JS+CSS实现仿msn风格选项卡效果代码
2015/10/22 Javascript
ES6的新特性概览
2016/03/10 Javascript
Node.js的npm包管理器基础使用教程
2016/05/26 Javascript
jQuery 插件实现随机自由弹跳气泡样式
2017/01/12 Javascript
详解在vue-cli中使用路由
2017/09/25 Javascript
细说webpack源码之compile流程-入口函数run
2017/12/26 Javascript
从零开始最小实现react服务器渲染详解
2018/01/26 Javascript
vue-router动态设置页面title的实例讲解
2018/08/30 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
2018/09/20 Javascript
JavaScript常见继承模式实例小结
2019/01/11 Javascript
swiper实现异形轮播效果
2019/11/28 Javascript
简单了解Django模板的使用
2017/12/20 Python
Python3自动签到 定时任务 判断节假日的实例
2018/11/13 Python
windows、linux下打包Python3程序详细方法
2020/03/17 Python
HTML5 File接口在web页面上使用文件下载
2017/02/27 HTML / CSS
Html5页面二次分享的实现
2018/07/30 HTML / CSS
Made in Design意大利:现代家具、名家灯具和装饰
2020/10/27 全球购物
Vrbo英国:预订度假屋
2020/08/19 全球购物
AJAX都有哪些有点和缺点
2012/11/03 面试题
大学生怎样写好自荐信
2014/02/25 职场文书
四风剖析查摆对照检查材料思想汇报
2014/09/24 职场文书
教师考核评语大全
2014/12/31 职场文书
2015年学生会主席工作总结
2015/04/21 职场文书
七一表彰大会简报
2015/07/20 职场文书
python中的装饰器该如何使用
2021/06/18 Python