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
如何分别全角和半角以避免乱码
Oct 09 PHP
在PHP中执行系统外部命令
Oct 09 PHP
页面乱码问题的根源及其分析
Aug 09 PHP
php实现微信公众平台账号自定义菜单类
Dec 02 PHP
Laravel中Trait的用法实例详解
Mar 16 PHP
PHP调用存储过程返回值不一致问题的解决方法分析
Apr 26 PHP
php图片上传类 附调用方法
May 15 PHP
PHP使用mysqli操作MySQL数据库的简单方法
Feb 04 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
Mar 18 PHP
PHP实现的文件浏览器功能简单示例
Sep 12 PHP
php传值和传引用的区别点总结
Nov 19 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
模仿OSO的论坛(二)
2006/10/09 PHP
具有时效性的php加密解密函数代码
2013/06/19 PHP
jquery multiSelect 多选下拉框
2010/07/09 Javascript
js读取注册表的键值示例
2013/09/25 Javascript
jQuery简单实现banner图片切换
2014/01/02 Javascript
javascript读取文本节点方法小结
2016/12/15 Javascript
从零学习node.js之模块规范(一)
2017/02/21 Javascript
webpack构建换肤功能的思路详解
2017/11/27 Javascript
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
bootstrap-table+treegrid实现树形表格
2019/07/26 Javascript
jQuery中DOM操作原则实例分析
2019/08/01 jQuery
弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】
2019/08/07 Javascript
vue+iview框架实现左侧动态菜单功能的示例代码
2020/07/23 Javascript
Element-UI 使用el-row 分栏布局的教程
2020/10/26 Javascript
Python中下划线的使用方法
2015/03/27 Python
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
Python之reload流程实例代码解析
2018/01/29 Python
python列表生成式与列表生成器的使用
2018/02/23 Python
pygame游戏之旅 添加游戏界面按键图形
2018/11/20 Python
python gensim使用word2vec词向量处理中文语料的方法
2019/07/05 Python
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
安装PyInstaller失败问题解决
2019/12/14 Python
HTML5 drag和drop具体使用详解
2021/01/18 HTML / CSS
阿迪达斯新加坡官方网站:adidas新加坡
2019/12/06 全球购物
Java面试题及答案
2012/09/08 面试题
试用期员工考核制度
2014/01/22 职场文书
小学教师节活动方案
2014/01/31 职场文书
秋季运动会活动方案
2014/02/05 职场文书
党员干部2014全国两会学习心得体会
2014/03/10 职场文书
领导班子四风表现材料
2014/08/23 职场文书
2014乡镇机关党员个人对照检查材料思想汇报
2014/10/09 职场文书
大学生入党群众意见书
2015/06/02 职场文书
网吧温馨提示
2015/07/17 职场文书
Vue过滤器(filter)实现及应用场景详解
2021/06/15 Vue.js
解决springboot druid数据库连接失败后一直重连的方法
2022/04/19 Java/Android
Redis配置外网可访问(redis远程连接不上)的方法
2022/12/24 Redis