POS电子凭条
数据
收单机构
商户
发卡机构
提供POS电子凭证查询、下载,实现收单机构或商户对签购单的长期保管、备查。(注:仅支持福建省范围内机构和指定商户使用。)
服务对象

仅限福建省机构用户、指定商户用户,开发者用户不可用。

产品详情

日常消费刷卡后,特约商户要求持卡人签字确认,记载持卡人的姓名、账号、消费金额向银行收取款项的凭证。

 

POS电子凭条上有商户号、终端号、持卡人银行卡卡号及交易数据等信息,为谨防不法分子非法利用,商家和持卡人都需保留好凭条(商家应保留至少1年以上时间)或妥善处理。

本产品可提供POS电子凭证查询、下载。


应用场景

POS电子凭条可用于消费交易(集中式商圈、品牌连锁)、财务管理等场景,主要用于对账、清算和明细查询等后期需要,POS电子凭条将签购单以电子化形式储存,实现收单机构或商户对签购单的长期保管、备查。

 

注意事项:

收单机构仅能查询自身收单的直联商户终端上传的POS电子凭条查询。

 


接入流程

1.如需申请该API,请点击本页面“业务申请”,并认真填写相关内容;

2.待业务接口人审核通过后即可调用该API,审核周期约为2-3个工作日;

3.技术联调,可参照《OpenAPI技术文档—接入指南》


具体开发接入请查看“POS电子凭条”常见问题
具体开发接入请查看“POS电子凭条 ”文档资源进行下载
步骤一:引入JS

在需要调用JS接口的页面引入如下JS文件,(仅支持https):https://open.95516.com/s/open/js/upsdk.js。
upsdk.js文件依赖Zepto或Jquery,Zepto的版本要求1.0及以上,Jquery的版本要求1.4及以上(建议用最新的Zepto及Jquery)。

步骤二:通过config接口注入权限验证配置

所有需要使用UPSDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次; 如果跳转的页面无需使用插件,则无需config, 否则需要重新执行config)。
Upsdk.config({
 appId: ‘’, // 必填,接入方的唯一标识
 timestamp: , // 必填,生成签名的时间戳,从1970年1月1日00:00:00至今的秒数
 nonceStr: ‘’, // 必填,生成签名的随机串
 signature: ‘’,// 必填,生成签名的摘要,采用sha256算法, 详见最后一章FAQ
 debug: true // 开发阶段可打开此标记,云闪付APP会将调试信息toast出来
});

建议接入方在开发联调时,打开debug: true 开关,UPSDK只有在开关打开时才会输出状态信息,帮助开发者定位错误。 请务必在最终生产版本关闭此开关。

步骤三:配置信息验证

(1)通过ready接口处理成功验证
upsdk.ready(function(){
 // config信息验证后会执行ready方法
});
(2)通过error接口处理失败验证
upsdk.error(function(err){
 // config信息验证失败会执行error方法
});

另:判断是否在云闪付APP内

var agent = navigator.userAgent.toLowerCase();
var isInsideWallet = ((new RegExp(/(com.unionpay.chsp)/).test(agent)) || (new RegExp(/(com.unionpay.mobilepay)/).test(agent)));
插件详情

a) 总体说明
参数基于如下字典格式传递,如果插件有成功回调的话,一定会调用success回调;有失败回调的话,会执行fail或者cancel回调。

b) 支付接口
upsdk.pay({
 tn: ‘支付流水号Ticket Number.’,
 success: function(){
  // 支付成功, 开发者执行后续操作。
 },
 fail: function(err){
  // 支付失败, err.msg 是失败原因描述, 比如TN号不合法, 或者用户取消了交易等等。
 }
});
前台支付对接,整个支付流程详解请参考第五章第二节FAQ。

c) 拍照或从手机相册中选图接口
upsdk.chooseImage({
 maxWidth: ‘目标图片宽度, 默认500’, 可选
 maxHeight: ‘目标图片高度, 默认1000’, 可选
 sourceType: ‘1|2|3, 仅允许拍照|仅允许从手机相册中选图|拍照或从手机相册中选图都支持, 默认为3’,可选
 success: function (data) {
  if (data.base64) {
   // 目标图片采用base64编码.
  }
 }
});
此接口还会返回选择的图片类型,比如jpg|png|gif

d) 设置页面标题接口
upsdk.setNavigationBarTitle({
 title: ‘设置云闪付标题’
});

e) 设置标题栏右边按钮接口
文字,图片均支持。
Upsdk.setNavigationBarRightButton({
 // title和image可任选其一, 同时有的话, title优先
 title: ‘标题栏文字’,
 image: ‘按钮图片绝对路径’,
 handler: function(){
  // 用户点击标题按钮以后回调函数
 }
});

f) 调用云闪付的扫码功能接口
upsdk.scanQRCode({
 scanType: [“qrCode”,”barCode”],
 success: function(result){
  alert(‘Scan result = ‘ + result);
 }
});

g) 绑定银行卡接口
upsdk.addBankCard({
 success: function(){
  // 绑卡成功
 },
 fail: function(){
  // 绑卡失败或者用户取消
 }
 sence: ‘场景号’ //可选参数,用来控制添加特定类型的银行卡,例如只添加信用卡
});

h) Toast文言显示接口
upsdk.showFlashInfo({
 msg: ‘绑定银行卡成功’
});

i)关闭当前WEB窗口接口
upsdk.closeWebApp();
无需传递参数,也没有回调函数返回。

j) 返回用户在首页选取的城市
upsdk.getLocationCity({
 success: function(cityCd){
   //插件返回的城市代码cityCd 符合全国行政区划代码表标准,比如广州市为440100
 }
});

k) 用户通过输入支付密码授权
此插件会引导用户进入支付密码输入页面,验证支付密码正确与否
upsdk.verifyPayPwd({
 transNo: ‘后台获取的支付密码验证流水号’,
 bizType:’业务类型编号 ‘,
 success: function() {
  // 支付密码验证通过
 }
});
请参考FAQ获取更多信息。

l) 获取用户当前位置经纬度
upsdk.getLocationGps({
 success: success,
 fail: fail
});
成功返回latitude 和longitude, 基于高德地图坐标系

m) 云闪付分享插件
upsdk.showSharePopup({
 title: ‘银联云闪付随机立减大优惠~!’,
 desc: ‘我刚刚使用银联云闪付, 省了30元,大家快来使用吧.’,
 shareUrl: ‘https://youhui.95516.com’,
 picUrl: ‘https://youhui.95516.com/web/image/mchnt/coupon/Z00000000138804_logo_list_web.jpg’
});
picUrl 选填,默认显示银联云闪付图标

n) 获取本地音视频(或图片)
分两个步骤:
步骤一:选择本地音视频(或图片),获取到文件基本信息
upsdk.chooseFileFromAlbum({
 maxSize: ‘1024’,// 最大上传的文件大小(单位byte),若选择的文件大于该值进入失败回调。建议值不要超过100m(即100*1024*1024)
 sourceType: ‘00’, // 00:仅支持视频文件,例如mp4、mov等。01:仅支持图片文件,例如png、jpg等。02:支持视频+图片文件。
 success:function(data){
  // 成功返回{url:’视频地址’,size:’视频大小’,filename:’视频文件名,例如123.mp4’}
 },
 fail: function(err){
  // 失败回调{code:’失败码’,msg:’失败原因描述’}
  // {code:’00’,msg:’参数错误’}
  // {code:’01’,msg:’内部错误’}
  // {code:’02’,msg:’权限失败’}
  // {code:’03’,msg:’用户选择的文件超过最大值’}
  // {code:’04’,msg:’其他错误’}
 }
});
步骤二:将选取的文件分块,通过以下插件分块获取文件流的base64
upsdk.readAlbumData({
 url: ‘url’,// 即步骤一成功回调获取视频地址url
 bufferSize: ‘1024’, //分块大小,单位byte,最大不可以超过512kb(即512*1024)
 fromOffset: ‘0’, //每块的开始位置,第一块为0,第二块为1*bufferSize,依次类推
 success:function(data){
  // 成功返回{data:’文件块的base64’,isFinished:’1’}
  // isFinished:0代表文件还有块未获取,1代表文件所有块已获取完毕
 },
 fail: function(err){
  // 失败回调{code:’失败码’,msg:’失败原因描述’}
  // {code:’00’,msg:’参数错误’}
  // {code:’01’,msg:’内部错误’}
  // {code:’02’,msg:’权限失败’}
  // {code:’03’,msg:’用户选择的文件超过最大值’}
  // {code:’04’,msg:’其他错误’}
 }
});

o) 录音并获取录音文件【录音文件格式为mp3,采用覆盖模式,只会存储最后一次的录音】
分两个步骤:
步骤一:开始录音,获得成功回调后,可以选择主动停止录音,或者等待最大录音时间后自动停止。
/**
* 开始录音插件
*/
upsdk.startAudioRecording({
 maxTime: ‘10’,// 单位为秒,必选参数,允许用户录制的最大时间
 success:function(){
  // 成功回调,此处可选择主动停止录音,或者等待maxTime
 },
 fail: function(err){
  // 失败回调{code:’失败码’,msg:’失败原因描述’}
  // {code:’00’,msg:’参数错误’}
  // {code:’01’,msg:’内部错误’}
  // {code:’02’,msg:’权限失败’}
  // {code:’03’,msg:’用户选择的文件超过最大值’}
  // {code:’04’,msg:’其他错误’}
 }
});
/**
* 停止录音插件
*/
upsdk.stopAudioRecording({
 success:function(){
  // 成功回调,此处可获取已录好的本地音频文件
 },
 fail: function(err){
  // 失败回调{code:’失败码’,msg:’失败原因描述’}
  // {code:’00’,msg:’参数错误’}
  // {code:’01’,msg:’内部错误’}
  // {code:’02’,msg:’权限失败’}
  // {code:’03’,msg:’用户选择的文件超过最大值’}
  // {code:’04’,msg:’其他错误’}
 }
});
步骤二:将录好的本地音频文件分块,通过以下插件分块获取文件流的base64。【注意,该插件应该在停止录音插件成功回调中使用,或者等待最大录音时间maxTime后才能使用】
upsdk.readAudioRecordingData({
 bufferSize: ‘1024’, //分块大小,单位byte,最大不可以超过512kb(即512*1024)
 fromOffset: ‘0’, //每块的开始位置,第一块为0,第二块为1*bufferSize,依次类推
 success:function(data){
  // 成功返回{data:’文件块的base64’,isFinished:’1’}
  // isFinished:0代表文件还有块未获取,1代表文件所有块已获取完毕
 },
 fail: function(err){
  // 失败回调{code:’失败码’,msg:’失败原因描述’}
  // {code:’00’,msg:’参数错误’}
  // {code:’01’,msg:’内部错误’}
  // {code:’02’,msg:’权限失败’}
  // {code:’03’,msg:’用户选择的文件超过最大值’}
  // {code:’04’,msg:’其他错误’}
 }
});
备注:始终保存最后一次录音的文件,仅在卸载APP后才会清除。

p) 录视频并获取视频文件【录频文件格式为mp4,采用覆盖模式,只会存储最后一次录的视频】
分两个步骤:
步骤一:开始录视频,到达最大录制时间,视频自动录制结束。用户录制完视频后调用成功回调。
/**
* 开始录视频插件
*/
upsdk.startVideoRecording({
 maxTime: ‘10’,// 单位为秒,必选参数,允许用户录制的最大时间
 success:function(){
  // 成功回调,此时用户已完成录制视频,可获取录制的视频文件
 },
 fail: function(err){
  // 失败回调{code:’失败码’,msg:’失败原因描述’}
  // {code:’00’,msg:’参数错误’}
  // {code:’01’,msg:’内部错误’}
  // {code:’02’,msg:’权限失败’}
  // {code:’03’,msg:’用户选择的文件超过最大值’}
  // {code:’04’,msg:’其他错误’}
 }
});
步骤二:将录好的本地视频文件分块,通过以下插件分块获取文件流的base64。【注意,该插件应该在开始录视频插件成功回调中使用。】
upsdk.readVideoRecordingData({
 bufferSize: ‘1024’, //分块大小,单位byte,最大不可以超过512kb(即512*1024)
 fromOffset: ‘0’, //每块的开始位置,第一块为0,第二块为1*bufferSize,依次类推
 success:function(data){
  // 成功返回{data:’文件块的base64’,isFinished:’1’}
  // isFinished:0代表文件还有块未获取,1代表文件所有块已获取完毕
 },
 fail: function(err){
  // 失败回调{code:’失败码’,msg:’失败原因描述’}
  // {code:’00’,msg:’参数错误’}
  // {code:’01’,msg:’内部错误’}
  // {code:’02’,msg:’权限失败’}
  // {code:’03’,msg:’用户选择的文件超过最大值’}
  // {code:’04’,msg:’其他错误’}
 }
});
备注:始终保存最后一次录音的文件,仅在卸载APP后才会清除。

q) 获取活体检测后保存在本地的视频和图片
1. 获取活体检测的视频(一次获取,视频格式为mp4)
upsdk.readFaceVideoData({
 success:function(data){
  // 成功返回{data:’文件块的base64’}
 },
 fail: function(err){
  // 失败回调{code:’失败码’, msg:’失败原因描述’}
  // {code:’00’, msg:’参数错误’}
  // {code:’01’, msg:’内部错误’}
  // {code:’07’, msg:’文件不存在’}
 }
});
2. 获取活体检测的图片(一次获取,图片格式为jpg)
upsdk.readFaceImageData({
 success:function(data){
  // 成功返回{data:’文件块的base64’}
 },
 fail: function(err){
  // 失败回调{code:’失败码’, msg:’失败原因描述’}
  // {code:’00’, msg:’参数错误’}
  // {code:’01’, msg:’内部错误’}
  // {code:’07’, msg:’文件不存在’}
 }
});

r) 通知客户端刷新卡管家中的虚拟卡列表
upsdk.noteInfoChange()
无需传递参数,也没有回调函数返回。

s) 打开客户端中特定React Native页面
upsdk.openRNPage({
 dest: "rntransfer", // 必传,目标RN页面,示例中表示打开 转账页面(RN实现)
 isFinished: "1", // 可选,默认为‘0’,为‘1’则关闭当前webview
 extraData: {// 可选,具体参数内容与对接业务强相关,以下示例为农村转账业务:
  KTransferRouteType: "3", //固定值 转账类型”3" 表示进入农村转账场景
  kTransferUserMsg: {
   transferName: "name", //name 姓名 不加掩码
   transferCardNum: "card", //card 卡号 全卡号
   transferAmount: "amount" //金额 单位分 整数不能有小数
  },
  kTransferThirdMsg: { //生活后台接口新增字段 后续获取tn 支付使用
   thirdOrderId: "", // 第三方订单流水号
   thirdName: "", //第三方抬头
   thirdType: "appId" //接入方的唯一标识
  }
 },
 success:function(){ // 成功跳转 },
 fail: function(msg){ // 失败回调}
});
注意:属性extraData为可选参数,是否传该参数以及具体该参数的值的具体内容需与对接业务沟通并确认好,以上示例仅为农村转账业务。

t) 地图导航插件
通过提供起始经纬度等信息调用插件可打开地图并显示导航路线
upsdk.navi({
 sLat:'31.23958', // 起点维度
 sLon:'121.499763', // 起点经度
 sName:'上海东方明珠', // 起点名称
 dLat:'39.917854', // 终点维度
 dLon:'116.397006', // 终点经度
 dName:'北京故宫', // 终点名称
 success:function(){ // 成功回调 },
 fail: function(msg){ // 失败回调}
});

u) 设置屏幕亮度
upsdk.setScreenBrightness({
 brightness:'0.2', // 屏幕亮度值,范围取值0-1。精确到小数点后一位
 success:function(data){
  // 成功回调 {data.brightness}
 },
 fail: function(msg){ // 失败回调}
});

v) 获取当前屏幕亮度
upsdk.getScreenBrightness({
 success:function(data){
  // 成功回调 {data.brightness}
 },
 fail: function(msg){ // 失败回调}
});

w) 打开屏幕截图权限(仅限android使用)
upsdk.changeScreenShot({
 switch:true, // true表示禁止截屏,false表示允许截屏
 success:function(){ // 成功回调 },
 fail: function(msg){ // 失败回调}
});

x) 监听屏幕截屏(仅限ios使用)
upsdk.monitorScreenShot({
 success:function(){
  // 成功回调,表明用户已经进行了截屏
 }
});
备注:通常只在需要监听的页面调用该插件打开监听。

y) 移除监听屏幕截屏(仅限ios使用)
upsdk.removeScreenShot({
 success:function(){
  // 成功回调,表明用户已经移除了截屏
 }
});
备注:打开监听后,只有当该webview关闭后才会停止监听。若其它页面不需要监听可调用该插件移除监听。


应答码参照
应答码 描述 解决方案
0000 处理成功。 展开详情
1001 接口未定义 展开详情
暂无
1002 接口调用失败 展开详情
暂无
1003 查询失败,交易开始日期距今大于1年 展开详情
暂无
9901 您的IP(XXX.XXX.XXX.XXX)没有登记,请登录银联开放平台(https://open.unionpay.com/tjweb/user/info)进行白名单登记。 展开详情
暂无
9902 您的IP(XXX.XXX.XXX.XXX)已被限制访问,请登录银联开放平台(open.unionpay.com)提交申诉请求。 展开详情
暂无
9903 您的IP(XXX.XXX.XXX.XXX)请求过于频繁,已被临时限制,请5分钟后再尝试。 展开详情
暂无
9904 您的 IP(XXX.XXX.XXX.XXX)不属于你设置的开发IP列表,请登录银联开放平台(open.unionpay.com)确认相关配置。 展开详情
暂无
9905 请求参数值有误,请确认请求参数信息。 展开详情
暂无
9906 您的账号不具备当前产品请求权限,如有权限,可重新获取该产品Token后再尝试。 展开详情
暂无
9907 app_id与app_secret验证失败。 展开详情
暂无
9908 您的Token已过期,请重新获取Token。 展开详情
暂无
9909 您的Token信息非最新Token,请确保您的系统中使用的是最新的Token值。 展开详情
暂无
9910 您的签名密钥未设置,请登录银联开放平台(https://open.unionpay.com/tjweb/user/info)确认相关配置。 展开详情
暂无
9911 您的签名信息验证不通过,请检查您的签名实现是否符合银联开放平台(open.unionpay.com)提供的签名规则。 展开详情
暂无
9912 您的报文格式有误,要求报文符合JSON数据格式。 展开详情
暂无
9913 你的报文数据有误,未通过数据信息校验,具体原因视业务需求。 展开详情
暂无
9914 您的报文无法解密,请检查您在银联开放平台(open.unionpay.com)上提供的RSA公钥是否正确。 展开详情
暂无
9915 您的API调用额度已耗尽,需充值付费后补充调用额度。 展开详情
暂无
9916 您的API并发调用额度已耗尽,需联系管理员调整您的并发限额。 展开详情
暂无
9917 您的账号不具备当前产品API请求权限,请联系相关业务接口人。 展开详情
暂无
9991 银联开放平台系统内部错误:产品服务调用失败。 展开详情
暂无
9992 银联开放平台系统内部错误:产品服务系统未知错误 展开详情
暂无
9993 银联开放平台系统内部错误:产品服务未注册至服务中心 展开详情
暂无

1.报文举例-获取token


请求URL:

https://openapi.unionpay.com/upapi/voucher/token?app_id=[value]&app_secret=[value] 

应答JSON报文体:

{
    
    "respCd":"0000"
       "respMsg":"成功"
       "token": "abcdefghijklmn123456789",
       "expire_in": 7200
}



2.报文举例-交易信息查询接口


请求URL:


https://openapi.unionpay.com/upapi/voucher/queryPosVoucherListForMerchant?token=[token]&sign=[sign]&ts=[ts]

请求报文参数:

{

    "merchantCode": "111111111111111",
    "terminalId":"11111111",
    "priAccountNo":"6226091111111868",
    "startDate":"20180901",
    "endDate":"20180920",
    "start":"1",
    "pageSize":"10"
}

应答JSON报文体:

{
  
    "respCd":"0000"
    "respMsg": "接口调用成功", 
    "data": {
        "list" : [{
                    "id":"00000002",
                    "priAccountNo ":"622609******1868",
                    "transPosAt":"200",
                    "merchantCode":"111111111111111",
                    "terminalId":"11111111",
                    "terminalBatchNumber":"11111112",
                    "terminalSequence":"111112",
                    "paSettleDate":"20180901",
                    "transDate":"20180901",
                    "transDateTime":"111111",
                    },{…}
               ]
     }
}



3.报文举例-POS电子凭条生成接口


请求URL:


https://openapi.unionpay.com/upapi/voucher/createPosTransVoucher?token=[token]&sign=[sign]&ts=[ts]

请求报文参数:

{

    "transDate": "20180901",
    "id":"11111111"
}

应答JSON报文体:

{
  
    "respCd":"0000"
    "respMsg": "接口调用成功", 
    "data": {
                "success":"true",
                "errorCode ":"",
                "transVouCreateError":"",
                "vouData":"/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgc",
                "vouFormat":"jpg"        
        
     }
}

1. OpenAPI使用教程请参考在线文档:

OpenAPI使用指南—接入指南


2. OpenAPI安全调用过程请参考在线文档:

2.1OpenAPI使用指南—获取产品token

2.2OpenAPI使用指南—产品功能接口调用


3. OpenAPI接口调用报文签名样例请参考在线文档:

OpenAPI使用指南—报文签名样例代码


4. OpenAPII测试工具使用说明请参考在线文档:

OpenAPI使用指南—OpenAPI测试工具



联系我们

业务咨询: 0591-87870558

刘蓓臻

bzliu@unionpay.com

技术咨询: 021-20633521

张昊

zhanghao1@unionpay.com

咨询与服务