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和ACCESS写聊天室(三)
Oct 09 PHP
PHP中函数内引用全局变量的方法
Oct 20 PHP
PHP OPP机制和模式简介(抽象类、接口和契约式编程)
Jun 09 PHP
PHP中模拟处理HTTP PUT请求的例子
Jul 22 PHP
getJSON跨域SyntaxError问题分析
Aug 07 PHP
php查询mssql出现乱码的解决方法
Dec 29 PHP
php include类文件超时问题处理
Feb 06 PHP
php判断文件夹是否存在不存在则创建
Apr 09 PHP
如何通过Linux命令行使用和运行PHP脚本
Jul 29 PHP
php实现curl模拟ftp上传的方法
Jul 29 PHP
php 数组随机取值的简单实例
May 23 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
Jan 16 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 图片上传实现代码 带详细注释
2010/04/29 PHP
php中转义mysql语句的实现代码
2011/06/24 PHP
Yii2主题(Theme)用法详解
2016/07/23 PHP
PHP批斗大会之缺失的异常详解
2019/07/09 PHP
javascript引导程序
2008/10/26 Javascript
JQuery操作单选按钮以及复选按钮示例
2013/09/23 Javascript
js使用DOM操作实现简单留言板的方法
2015/04/10 Javascript
jquery小火箭返回顶部代码分享
2015/08/19 Javascript
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
2015/09/24 Javascript
jQuery EasyUI常用数据验证汇总
2016/09/18 Javascript
AngularJS实现动态编译添加到dom中的方法
2016/11/04 Javascript
JS使用正则实现去掉字符串左右空格的方法
2016/12/27 Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
2017/04/17 jQuery
phantomjs导出html到pdf的方法总结
2017/10/19 Javascript
nodejs实现爬取网站图片功能
2017/12/14 NodeJs
vue实现键盘输入支付密码功能
2018/08/18 Javascript
[41:20]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS DK
2014/05/26 DOTA
[05:59]带你看看DPC的台前幕后
2021/03/11 DOTA
Python 文件管理实例详解
2015/11/10 Python
Python2中文处理纪要的实现方法
2018/03/10 Python
django 开发忘记密码通过邮箱找回功能示例
2018/04/17 Python
Python动态导入模块的方法实例分析
2018/06/28 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
2019/04/26 Python
python实现nao机器人手臂动作控制
2019/04/29 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
关于Pytorch MaxUnpool2d中size操作方式
2020/01/03 Python
Tensorflow轻松实现XOR运算的方式
2020/02/03 Python
python开发入门——列表生成式
2020/09/03 Python
详解Python中的Lock和Rlock
2021/01/26 Python
荷兰最大的多品牌男装连锁店:Adam Brandstore
2019/12/31 全球购物
如何在Shell脚本中使用函数
2015/09/06 面试题
学生操行评语大全
2014/04/24 职场文书
初中优秀教师事迹材料
2014/08/18 职场文书
校本课程教学计划
2015/01/19 职场文书
2015年乡镇党务公开工作总结
2015/05/19 职场文书
《好妈妈胜过好老师》:每个孩子的优秀都是有源头的
2020/01/03 职场文书