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 相关文章推荐
为查询结果建立向后/向前按钮
Oct 09 PHP
用session做客户验证时的注意事项
Oct 09 PHP
PHP生成验证码时“图像因其本身有错无法显示”的解决方法
Aug 07 PHP
php获取qq用户昵称和在线状态(实例分析)
Oct 27 PHP
php curl模拟post提交数据示例
Dec 31 PHP
php搜索文件程序分享
Oct 30 PHP
PHP微信开发之查询微信精选文章
Jun 23 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
Jan 30 PHP
php注册审核重点解析(数据访问)
May 23 PHP
PHP使用PDO抽象层获取查询结果的方法示例
May 10 PHP
PHP通过get方法获得form表单数据方法总结
Sep 12 PHP
Thinkphp集成抖音SDK的实现方法
Apr 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
php5编程中的异常处理详细方法介绍
2008/07/29 PHP
浅析memcache启动以及telnet命令详解
2013/06/28 PHP
Yii 2.0如何使用页面缓存方法示例
2017/05/23 PHP
php常用字符串查找函数strstr()与strpos()实例分析
2019/06/21 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
2019/10/11 PHP
js 获取(接收)地址栏参数值的方法
2013/04/01 Javascript
VS2008中使用JavaScript调用WebServices
2014/12/18 Javascript
jquery获取节点名称
2015/04/26 Javascript
浅谈jQuery中replace()方法
2015/05/13 Javascript
JavaScript中的getMilliseconds()方法使用详解
2015/06/10 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
微信小程序tabbar不显示解决办法
2017/06/08 Javascript
Vue路由钩子之afterEach beforeEach的区别详解
2018/07/15 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
layui实现tab的添加拒绝重复的方法
2019/09/04 Javascript
python中sets模块的用法实例
2014/09/30 Python
python中list循环语句用法实例
2014/11/10 Python
python使用线程封装的一个简单定时器类实例
2015/05/16 Python
在Python中处理字符串之ljust()方法的使用简介
2015/05/19 Python
python pandas 如何替换某列的一个值
2018/06/09 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
完美解决keras保存好的model不能成功加载问题
2020/06/11 Python
python打包生成so文件的实现
2020/10/30 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
HTML5实现WebSocket协议原理浅析
2014/07/07 HTML / CSS
Europcar澳大利亚官网:全球汽车租赁领域的领导者
2019/03/24 全球购物
澳大利亚领先的亚麻品牌:Bed Threads
2019/12/16 全球购物
加拿大领先家居家具网上购物:Aosom.ca
2020/05/27 全球购物
非功能性需求都包括哪些方面
2013/10/29 面试题
仓库管理专业个人的自我评价
2013/12/30 职场文书
财务会计自荐信范文
2014/02/21 职场文书
学校班班通实施方案
2014/06/11 职场文书
高一课前三分钟演讲稿
2014/09/13 职场文书
2016年小学教师政治学习心得体会
2016/01/23 职场文书
新西兰:最新留学学习计划书写作指南
2019/07/15 职场文书
为什么node.js不适合大型项目
2021/04/28 Javascript