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 ss7.5的数据调用 (笔记)
Mar 08 PHP
基于asp+ajax和数据库驱动的二级联动菜单
May 06 PHP
Smarty变量调节器失效的解决办法
Aug 20 PHP
PHP的Socket通信之UDP通信实例
Jul 02 PHP
php简单日历函数
Oct 28 PHP
php防止CC攻击代码 php防止网页频繁刷新
Dec 21 PHP
PHP生成静态HTML文档实现代码
Jun 23 PHP
适合PHP初学者阅读的4本经典书籍
Sep 23 PHP
php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】
Apr 18 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
PHP pthreads v3下同步处理synchronized用法示例
Feb 21 PHP
PHP基于array_unique实现二维数组去重
Jul 14 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 microtime获取浮点的时间戳
2010/02/21 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
2014/06/23 PHP
Laravel框架中实现使用阿里云ACE缓存服务
2015/02/10 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
PHP实现对数字分隔加千分号的方法
2019/03/18 PHP
jquery三个关闭弹出层的小示例
2013/11/05 Javascript
javascript中不提供sleep功能如何实现这个功能
2014/05/27 Javascript
node.js学习总结之调式代码的方法
2014/06/25 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
2015/06/11 Javascript
jQuery Mobile操作HTML5的常用函数总结
2016/05/17 Javascript
关于function类中定义变量this的简单说明
2016/05/28 Javascript
javascript弹出窗口中增加确定取消按钮
2016/06/24 Javascript
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
2017/03/28 NodeJs
Spring shiro + bootstrap + jquery.validate 实现登录、注册功能
2017/06/02 jQuery
Angularjs单选框相关的示例代码
2017/08/17 Javascript
node实现定时发送邮件的示例代码
2017/08/26 Javascript
[11:57]《一刀刀一天》第十七期:TI中国军团加油!
2014/05/26 DOTA
[01:43]深扒TI7聊天轮盘语音出处4
2017/05/11 DOTA
[51:29]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第一场 11.05
2020/11/05 DOTA
[54:58]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第一场 11.25
2020/11/25 DOTA
Python 内置函数memoryview(obj)的具体用法
2017/11/23 Python
Python3实现获取图片文字里中文的方法分析
2018/12/13 Python
基于django ManyToMany 使用的注意事项详解
2019/08/09 Python
python @classmethod 的使用场合详解
2019/08/23 Python
python元组的概念知识点
2019/11/19 Python
python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例
2020/02/28 Python
Python对称的二叉树多种思路实现方法
2020/02/28 Python
印度最大的时尚购物网站:Myntra
2018/09/13 全球购物
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
全球性的众包图形设计市场:DesignCrowd
2021/02/02 全球购物
本科毕业自我鉴定
2014/03/20 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
乡镇计划生育工作汇报
2014/10/28 职场文书
钱学森电影观后感
2015/06/04 职场文书
三年级作文之小小梦想
2019/12/06 职场文书
基于Python的EasyGUI学习实践
2021/05/07 Python