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语法(1)
Oct 09 PHP
用PHP的ob_start();控制您的浏览器cache!
Nov 25 PHP
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
Jun 08 PHP
php中神奇的fastcgi_finish_request
May 02 PHP
PHP的substr_replace将指定两位置之间的字符替换为*号
May 04 PHP
基于php 随机数的深入理解
Jun 05 PHP
php Xdebug的安装与使用详解
Jun 20 PHP
php ImageMagick windows下安装教程
Jan 26 PHP
PHP全局变量与超级全局变量区别分析
Apr 01 PHP
php base64 编码与解码实例代码
Mar 21 PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
Mar 09 PHP
浅谈如何提高PHP代码质量之单元测试
May 28 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中使用curl_init函数的说明
2010/11/02 PHP
php实现斐波那契数列的简单写法
2014/07/19 PHP
php函数实现判断是否移动端访问
2015/03/03 PHP
thinkphp修改配置进入默认首页的方法
2017/02/07 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
php使用json-schema模块实现json校验示例
2019/09/28 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
JS将所有对象s的属性复制给对象r(原生js+jquery)
2014/01/25 Javascript
node.js中的fs.fchmodSync方法使用说明
2014/12/16 Javascript
JavaScript+CSS实现仿Mootools竖排弹性动画菜单效果
2015/10/14 Javascript
vue.js实现刷新当前页面的方法教程
2017/07/05 Javascript
AngularJS实用基础知识_入门必备篇(推荐)
2017/07/10 Javascript
jQuery 同时获取多个标签的指定内容并储存为数组
2018/11/20 jQuery
JS开发常用工具函数(小结)
2019/07/04 Javascript
vue+elementUI(el-upload)图片压缩,默认同比例压缩操作
2020/08/10 Javascript
解决vue初始化项目一直停在downloading template的问题
2020/11/09 Javascript
[03:19]2016国际邀请赛中国区预选赛第四日TOP10镜头集锦
2016/07/01 DOTA
对Python 2.7 pandas 中的read_excel详解
2018/05/04 Python
python 字符串只保留汉字的方法
2018/11/16 Python
matplotlib实现热成像图colorbar和极坐标图的方法
2018/12/13 Python
Python实现的删除重复文件或图片功能示例【去重】
2019/04/23 Python
使用OpCode绕过Python沙箱的方法详解
2019/09/03 Python
python中设置超时跳过,超时退出的方式
2019/12/13 Python
基于python计算并显示日间、星期客流高峰
2020/05/07 Python
印尼最大的婴儿用品购物网站:Orami
2017/09/28 全球购物
Stella McCartney官网:成衣、包袋、香水、内衣、童装及Adidas系列
2018/12/20 全球购物
新西兰网上购物,折扣店:BestDeals.co.nz
2019/03/20 全球购物
shallow copy和deep copy的区别
2016/05/09 面试题
出纳岗位职责模板
2013/11/27 职场文书
六十岁生日答谢词
2014/01/10 职场文书
优质服务活动实施方案
2014/05/02 职场文书
关于安全的演讲稿
2014/05/09 职场文书
医药公司采购员岗位职责
2014/09/12 职场文书
2014幼儿园中班工作总结
2014/11/10 职场文书
干货:如何写好工作总结报告!
2019/05/10 职场文书
SQL Server中常用截取字符串函数介绍
2022/03/16 SQL Server