应用宝-ysdk-米大师 对接道具直购服务器端下单模式 java服务端开发日志

2023-05-16

用于接收回调请求的linux服务器证书配置:

回调服务器配置分三种,前两种是当服务部署在腾讯云上时的配置方式,第三种为服务部署在自己服务器上是的配置方式:
hosting应用on CVM(即应用部署在腾讯CVM服务器上):
-发货URL只需HTTP协议即可,不需要使用SSL安全协议。
-必须使用9001端口(内网端口,需开发者主动启用,用apache iis或nginx做一个web监听,端口改成9001)。
hosting应用on CEE_V2(即应用部署在腾讯CEE_V2服务器上):
-发货URL只需HTTP协议即可,不需要使用SSL安全协议。
-必须使用9001端口(内网端口,需开发者主动启用,用apache iis或nginx做一个web监听,端口改成9001)。
-路径必须以ceecloudpay开头,即支付相关代码必须都放到应用根目录下的“ceecloudpay”目录下。
-对于CEE其发货URL的IP只能填写为10.142.11.27或者10.142.52.17(详见:CEE_V2访问云支付)。
non-hosting应用(即应用部署在开发者自己的服务器上)
-发货URL必须使用HTTPS协议。
-必须使用443端口(外网端口)。
这里采用non-hosting应用配置方式,方式为在linux服务器的nginx/conf/nginx.conf文件下添加如下配置(nginx版本1.14.0):

# HTTPS server
server {
    listen                      443 ssl;
    server_name                 localhost;
    #"/usr/.../"为自己放证书文件的目录地址
    ssl_certificate             /usr/.../1**_**6.crt;
    ssl_certificate_key         /usr/.../1**_**6.key;
    ssl_client_certificate      /usr/.../ca.crt;
     
    ssl_session_cache           shared:SSL:1m;
    ssl_session_timeout         5m;

    ssl_ciphers                 HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;
}

配置完后重新加载nginx使配置生效。

服务器下单:

服务器请求下单参数:

HashMap<String, String> params = new HashMap<>();//params类型不能是Map<String,String>会报错,需要改为HsahMap<String,String>
//必填参数
params.put("openid", "");//app登陆获取
params.put("openkey", "");//app登陆获取
params.put("appid", APP_ID);//应用id
params.put("ts", String.valueOf(System.currentTimeMillis() / 1000L));//时间戳(单位:秒)
params.put("payitem", product_id + "*" + price * 10 + "*1");//使用x*p*num的格式,x表示物品ID,p表示单价(以Q点为单位,1Q币=10Q点,单价的制定需遵循腾讯定价规范),num表示默认的购买数量
params.put("goodsmeta", "充值*金币充值");//物品信息,格式必须是name*des,批量购买套餐时也只能有1个道具名称和1个描述,即给出该套餐的名称和描述
params.put("goodsurl", "http://.../coin.png");//物品的图片url(长度<512字符)
params.put("pf", "");//app登陆获取
params.put("pfkey", "");//app登陆获取
params.put("zoneid", "1");//应用如果没有分区:传zoneid=1
//可选参数
params.put("amt", "1");//道具总价值。应用宝支持的qq支付和微信支付方式会有折扣(qq点和qq卡一般没有折扣),导致回调的amt数值与请求下单时的amt值不一致,所以回调避免用amt做金额验证,如有必要,可以在回调代码里采用Double.parseDouble(payitem.split("\\*")[1])的值做金额验证
params.put("appmode", "1");//(可选)1表示用户不可以修改物品数量,2 表示用户可以选择购买物品的数量
params.put("format", "json");//json、jsonp_$func。默认json。如果jsonp,前缀为:$func 例如:format=jsonp_sample_pay,返回格式前缀为:sample_pay()
params.put("userip", "");//用户ip
params.put("app_metadata", "");//发货时透传给应用。长度必须<=128字符,可以传商户id,便于回调后续做验证

生成签名:

//SnsSigCheck为腾讯开放平台提供的签名方法:[SDK下载](http://qzonestyle.gtimg.cn/qzone/vas/opensns/res/doc/Java_SDK_V3.0.6.zip)
params.put("sig", SnsSigCheck.makeSig("POST", "/v3/r/mpay/buy_goods_m", params,APP_KEY + "&"));//java调用签名方法必须用post请求,APP_KEY为app密钥

服务器下单请求cookie:

//不必自己生成cookie直接调用官方工具包的方法,所以直接传入HashMap<String,String>作为cookie的配置即可
HashMap<String, String> cookies = new HashMap<>();
if ("qq".equalsIgnoreCase(txOpenPayOrderPost.getLoginType())) {//这里的wx/qq需前端传入
    cookies.put("session_id", "openid");
    cookies.put("session_type", "kp_actoken");
    cookies.put("org_loc", SnsSigCheck.encodeUrl("/v3/r/mpay/buy_goods_m"));//org_loc的值需用官方工具类调用SnsSigCheck.encodeUrl方法做urlEncode,java自带的URLEncoder.encode方法因为不符合腾讯的规范,不建议使用
} else if ("wx".equalsIgnoreCase(txOpenPayOrderPost.getLoginType())) {
    cookies.put("session_id", "hy_gameid");
    cookies.put("session_type", "wc_actoken");
    cookies.put("org_loc", SnsSigCheck.encodeUrl("/v3/r/mpay/buy_goods_m"));
}

服务器下单请求方法:

//https://ysdktest.qq.com/mpay/buy_goods_m为测试服务器
String orderInfo = SnsNetwork.postRequest("https://ysdktest.qq.com/mpay/buy_goods_m", params, cookies,"http");

请求正确的返回值为:

{
"ret": 0,
"token": "7***2",
"url_params": "/**/***/**/mobile_goods_info?token_id=7**2",
"attach": ""
}

请求错误的返回值为:

{
"ret": **,//不为0的值
"msg": ***
}

最好做一个判断:

JSONObject jsonObject = JSON.parseObject(orderInfo);
if (jsonObject.getIntValue("ret") == 0) {
    logger.error("下单成功");
} else {
    logger.error("下单失败");
}

支付回调:

//支付回调的接口必须部署在前面配置了证书的linux服务器上,并在应用宝配置界面做配置
@RequestMapping(value = "/notify")
@ResponseBody
public String verify(HttpServletRequest request, HttpServletResponse response) throws Exception {
    String url = request.getRequestURI();//请求uri    
    HashMap<String, String> params = new HashMap<>();
    Enumeration em = request.getParameterNames();
    String req_sig = "";
    while (em.hasMoreElements()) {
        String key = (String) em.nextElement();
        String value = request.getParameter(key);
        if (key.equalsIgnoreCase("sig")) {
            req_sig = value;
        } else {
            params.put(key, encode(value));
        }
    }
    logger.error(params.toString());
    String appid = params.get("appid");//应用的唯一ID。可以通过appid查找APP基本信息。
    String appmeta = params.get("appmeta");//透传参数 可以用来获取商户订单号
    String billno = params.get("billno");//支付流水号(64个字符长度。该字段和openid合起来是唯一的)。
    String token = params.get("token");//应用调用v3/pay/buy_goods接口成功返回的交易token
    String payitem = params.get("payitem");//接收标准格式为ID*price*num   G001*10*1
    String sig = params.get("sig");//服务器签名
    Long orderId = Long.parseLong(appmeta.split("\\*")[0]);//从appmeta中截取的透传参数商户支付流水号
    Double amount = Double.parseDouble(payitem.split("\\*")[1]);
    String sys_sig = SnsSigCheck.makeSig("GET", url, params, APP_KEY + "&");
    if(req_sig != null && req_sig.equalsIgnoreCase(sys_sig)){
        logger.error("验证成功");
        //业务代码,自定义信息验证及数据库信息回写等
    }else{
        logger.error("验证失败");
        return JSONObject.toJSONString(mkResultMap(-2, "签名错误"));//这里的ret值会影响之后腾讯给前端回调的错误码值,计算方式为500000-ret.例如此处ret=-2,回调错误码即为499998,ret=2,回调错误码为500002,利用这一点可以写出分类比较详细的错误验证
    }
}
/**
* 生成成功回复结果map
*
* @param ret 结果code
* @param msg 结果msg
*/
private Map<String, Object> mkResultMap(int ret, String msg) {
    Map<String, Object> map = new HashMap<>();
    map.put("ret", ret);
    map.put("msg", msg);
    return map;
}
/**
* 解码腾讯编码规范
*
* @param string
* @return
*/
private String decode(String string) {
    // 替换ascii码为对应字符
    return string.replace("%2D", "-").replace("%2E", ".").replace("%5F", "_");
}
/**
* 编码腾讯编码规范
*
* @param string
* @return
*/
private String encode(String string) {
    // 替换腾讯不建议字符为ascii码
    return string.replace("-", "%2D").replace(".", "%2E").replace("_", "%5F");
}

参考资料:
1.腾讯米大师支付服务端接入流程
2.米大师介绍——道具直购模式介绍

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

应用宝-ysdk-米大师 对接道具直购服务器端下单模式 java服务端开发日志 的相关文章

  • CSS - position

    在 CSS 中 xff0c position 是实现元素定位的一种重要方式 使用定位的元素层叠级别比浮动会更高 xff0c 采用定位来控制元素位置会更加容易 一般我们使用定位 xff0c 是通过使用定位模式和边偏移量来确定元素位置的 定位模
  • React Native 选择器组件 / react-native-slidepicker

    react native slidepicker 一个纯 JavaScript 实现的的 React Native 组件 xff0c 用于如地址 xff0c 时间等分类数据选择的场景 github https github com lexg
  • 函数式组件 ref 的解决方案

    对于 React 中需要强制修改子组件的情况 xff0c React 提供了 Refs 这种解决办法 xff0c 使得我们可以操作底层 DOM 元素或者自定的 class 组件实例 除此之外 xff0c 文档 xff08 v17 0 1 x
  • JavaScript生成指定范围的随机数和随机数序列

    在JavaScript中我们经常使用Math random 方法生成随机数 xff0c 但是该方法生成的随机数只是0 1之间的随机数 先看如下常用方法的特征 xff1a 1 Math random 结果为0 1间的一个随机数 包括0 不包括
  • JavaScript生成指定范围随机数和随机序列

    在JavaScript中我们经常使用Math random 方法生成随机数 xff0c 但是该方法生成的随机数只是0 1之间的随机数 先看如下常用方法的特征 1 Math random 结果为0 1间的一个随机数 包括0 不包括1 2 Ma
  • 【React Native】JavaScript 中 bind 方法

    这个问题其实是一个 JavaScript 中的问题 JavaScript中jQury的bind方法为选定元素添加事件处理程序 xff0c 规定事件发生时运行的函数 语法为 xff1a selector bind event data fun
  • 瑞利信道:从原理到实现

    瑞利信道模型 瑞利信道模型是无线通信信道最重要 最基础的的仿真模型 无线信道中的平坦衰落信道基本上都是在瑞利信道模型的基础上修改而成 xff0c 比如应用同样广泛的莱斯信道就可以通过在瑞利信道的基础上简单的添加直流分量实现 xff0c 而频
  • N个数中的第k个最大值

    确定一组N个数中的第k个最大值 xff0c 这是数据结构和算法分析 java语言描述 中讨论的第一个问题 书中第一章也已给处两种常规思路 xff1a 1 xff0d 先将N个数的数组整体进行递减排序 xff0c 然后返回位置k 数组索引为k
  • 【React Native】app\build\intermediates\res\merged\debug\values-v24\values-v24.xml中错误

    昨天在项目中使用了 react native svg 库 xff0c 配置完成正在正常启动的时候 xff0c 却出现四个错误 xff0c 全部来源于app build intermediates res merged debug value
  • 【React Native】定位获取经纬度,当前城市等地址信息

    2019 8 21 使用内置对象 navigator 来获取经纬度信息 xff0c 参见 定位获取经纬度 xff0c 获取到经纬度等位置信息后需要用到第三方api位置解析 xff08 本文后半段 xff09 2019 7 20更新 xff1
  • 【React Native】定位获取经纬度

    RN 文档上的定位功能需要谷歌框架支持 xff0c 无疑带来了一些麻烦 github 上也有一些开源库 xff0c react native geolocation service等 但是这里还有一个更简便的位置获取 API 使用内置对象n
  • centos7系统下Python2.7升级到Python3.6踩的坑(yum失效,并非简单修改yum文件头)

    centos系统自带的Python2 7用的好好的 xff0c 我非手贱要去升级 xff0c 结果很严重 xff0c 正在运行服务器里面的yum崩了 xff0c 反复尝试了网上提到的几乎完全一致的解决方法 xff1a 将 usr bin y
  • 关于 Android Studio 4.0 创建新的activity和fragment 发现不存在

    1 在 app文件下面的 build gradle里面 注释以下代码
  • RAR文件格式-笔记

    RAR RAR 文件头 52 61 72 21 1A 07 00RAR 文件尾 C4 3D 7B 00 40 07 00 Rar 文件主要由标记块 xff0c 压缩文件头块 xff0c 文件头块 xff0c 结尾块组成 其每一块大致分为以下
  • pptv电话面试

    1 8种基本数据类型 2 String是基本数据类型吗 3 try return 1 catch return 2 finally return3 4 线程池 5 spring实现原理 6 s
  • Linux之systemd服务配置及自动重启

    Linux之systemd服务配置及自动重启 0 背景 在linux上开发时 xff0c 往往需要将自己的程序做成服务 xff0c 并且实现服务开机自动重启 xff0c 以及服务崩溃后自动重启功能 xff0c 本文就对该功能的实现做简单介绍
  • C++中类与对象的关系

    C 43 43 是一门面向对象的编程语言 xff0c 理解C 43 43 xff0c 首先要理解类 xff08 Class xff09 和对象 xff08 Object xff09 这两个概念 C 43 43 中的类 xff08 Class
  • 主定理的证明及应用举例

    主定理 主定理最早出现在 算法导论 中 xff0c 提供了分治方法带来的递归表达式的渐近复杂度分析 规模为n的问题通过分治 xff0c 得到a个规模为n b的问题 xff0c 每次递归带来的额外计算为c n d T n lt 61 aT n
  • Java设计模式 | 观察者模式解析与实战

    概述 观察者模式是一个使用率非常高的模式 xff0c 它最常用的地方是 GUI 系统 订阅 发布系统 这个模式的一个重要作用就是解耦 xff0c 将被观察者和观察者解耦 xff0c 使得它们之间的依赖性更小 xff0c 甚至做到毫无依赖 以
  • blob excel文件导出

    vue 项目中excel文件导出 xff1a exportData 点击方法名称 jjrExport this years then res 61 gt this years为请求参数 console log res const type

随机推荐

  • 知识管理——学习篇

    你的知识需要管理 田志刚 2009年11月 现在 xff0c 根据本书的理念 xff0c 你的使命不仅仅是获取该书的知识 xff08 获取什么 xff1f 他的前瞻性思考判断 xff0c 人家10年前有这种知识管理预见和意识 xff01 作
  • dependencyManagement_前进的火车_新浪博客

    dependencyManagement使用简介 Maven中的dependencyManagement元素提供了一种管理依赖版本号的方式 在dependencyManagement元素中声明所依赖的jar包的版本号等信息 xff0c 那么
  • 【Redis】Redis简介与基本特性

    简介 Redis 全称为 Remote DIctionary Server xff0c 本质上是一个 key value 存储系统 xff0c 属于跨平台的非关系型数据库 Redis 官方对它的定义是 xff1a Redis is an o
  • 【Java 集合类】Collections 类源码分析

    Collections 类源码分析 包路径 xff1a jdk1 8 0 111 rt jar java util Collections java Collections是JDK提供的工具类 xff0c 同样位于java util包中 它
  • 首个Adobe XD教程丨如何用Adobe Experience Design (XD)快速设计图标

    提示 xff1a 阅读本文前建议先从 码农与产品经理看过来 教你用Adobe Xd轻松做原型设计 文章入手 xff0c 会更加学度的掌握此建模神器的精髓http www zoomla cn blog techs 3080 shtml 逐浪小
  • 关于ubuntu下终端打开一闪就退出的一种情况

    终端ctrl 43 alt 43 t后终端一闪即过 首先你换一下访客进入ubuntu查看是否可以打开终端 可以 xff0c 请接着往下看 xff0c 否则抱歉 xff01 首先请你回想一下 xff0c 在这之前你对系统有没有做过什么更改 x
  • 如何转行游戏行业及我眼中的理想游戏开发团队

    前置内容 xff1a 很久没有写文章啦 xff0c 今天就来继续和大家聊一聊关于游戏制作的一些东西 今天主要聊两个方面 xff0c 一个是其他行业转游戏行业的一些注意事项以及需要具备的东西 xff1b 第二是和大家聊一聊我心目中理想的游戏开
  • 浅谈重载new操作符

    new是C 43 43 里非常重要的一个关键词 xff0c 用于申请内存 初始化对象 俗话说 有借有还再借不难 xff0c 通过new向操作系统 借 到的内存用完后必然要 还 回去 xff0c 所以对应地还有一个delete操作符与new共
  • SettingProvider工作原理

    1 基本介绍 SettingsProvider是一个提供设置数据共享的Provider xff0c 可以简单理解为数据库 xff0c 它包含全局性 系统级别的用户编好设置 xff0c 例如在手机中的Settings应用 xff0c 用户可以
  • 多普勒失真信号重采样的Matlab仿真分析

    多普勒失真信号重采样的Matlab仿真分析 应用场景 水声通信指的是使用声信号在水中传输数据 相对而言 xff0c 电磁信号在水中吸收严重衰减过快 xff0c 光信号受水中悬浮颗粒的影响 xff0c 也无法完成远距离传输 这两种信号的传播距
  • 1——Qt安装(ubuntu16.04 + Qt 5.14.2)

    下载Qt http download qt io archive qt 注 xff1a 下载Qt 5 14 2文件夹下的 run 文件 安装Qt 进入下载文件所在位置 xff0c 打开命令行终端 chmod 777 qt opensourc
  • git设置单个仓库用户名以及密码

    有些时候我们的服务器可能要部署多个git仓库 xff0c 不同git仓库的用户名以及密码都是不一样的 xff0c 此时需要我们设置单个仓库的用户名以及密码 1 git设置用户名以及邮箱 命令如下 xff1a git config user
  • php 多版本切换

    项目开发中实际会存在 xff0c php版本不同的情况 下面看具体实现方法 以下均是在 windows 下操作完成 1 先看一下我本地的 php 版本 我这里默认版本是php7 1 xff0c 下面看一下环境变量配置 默认版本不需要改 ph
  • apt-get 安装某个包时出现各种依赖包没有安装、版本不对互相套娃的一种解决方法

    错误信息 Depends 某某包 but it is not going to be installed 或者 Depends 某某包 61 某某版本 but 某某版本 is to be installed 本人是用的树莓派raspbian
  • Python 中更优雅的日志记录方案

    在 Python 中 xff0c 一般情况下我们可能直接用自带的 logging 模块来记录日志 xff0c 包括我之前的时候也是一样 在使用时我们需要配置一些 Handler Formatter 来进行一些处理 xff0c 比如把日志输出
  • 用Python抓包工具查看周边拼车情况

    说起Python爬虫 xff0c 很多人第一个反应可能会是Scrapy或者Pyspider xff0c 但是今天文章里用到是Python下一个叫Mitmproxy的抓包工具 xff0c 对付一些非常规的数据获取还是很有效的 不过凡事都是有利
  • Origin(教育版)无法更改语言是灰色的办法

    用edu后缀的邮箱可以申请正版Origin pro xff0c 但是本人下载下来后是英文版 xff0c 绘图的时候里面很多的专有名词真的一头雾水 xff0c 查看网上的教程说修改注册表 xff0c 试了后发生错误 xff0c 再次打开还是原
  • centos虚拟机切换为命令行模式

    打开命令终端Terminal 输入以下 systemctl set default multi user target 设置成命令模式 或 systemctl set default graphical target 设置成图形模式 最后
  • ubuntu操作不当,桌面图标和菜单栏消失怎么办

    最近配置一些文件没有成功 xff0c 重启后 xff0c 桌面只剩下文件和回收站 xff0c 我们可以通过终端输入指令来解决这个问题 xff0c 亲测有效 先用apt get install指令重装桌面 xff1a 快捷键或者右键打开终端
  • 应用宝-ysdk-米大师 对接道具直购服务器端下单模式 java服务端开发日志

    用于接收回调请求的linux服务器证书配置 xff1a 回调服务器配置分三种 xff0c 前两种是当服务部署在腾讯云上时的配置方式 xff0c 第三种为服务部署在自己服务器上是的配置方式 xff1a hosting应用on CVM xff0