java下载 应用宝下载

腾讯开放平台为广大开发者提供了SDK包,辅助开发者快速接入QQ登录、支付、社交渠道等功能。
最近更新日期
V3.1.0 SDK更新了如下内容:
修正以下功能:
1. 解决arm64-v8a架构下,在H5登录页面输入完帐号密码后点击登录时的崩溃问题;
2. 解决因FloatMath在Android 6.0上被去掉而导致使用了FloatMath的TouchView编译不过问题;
3. 解决横屏应用分享时可能接收不到回调和界面异常的问题;
4. 优化***包大小;
5. 其他bug修复。
如何使用SDK,请参见 。
如何调用具体API,请参见 。
常见问题汇总,请参见。
V3.1.0 SDK基础包更新如下内容:
修正以下功能:
1. 解决arm64-v8a架构下,在H5登录页面输入完帐号密码后点击登录时的崩溃问题;
2. 解决因FloatMath在Android 6.0上被去掉而导致使用了FloatMath的TouchView编译不过问题;
3. 解决横屏应用分享时可能接收不到回调和界面异常的问题;
4. 优化***包大小;
5. 其他bug修复。
V3.1.0完整包更新了以下内容:
新增功能:
一键加群功能
修正以下功能:
1. 修正 log 文件从 document 目录移到Caches目录;
2. 修正通过h5 登录,分享到手Q提示账号不符合;
3. 修正分享到群部落;
4. 修正sdk添加游戏好友获取好友设置失败;
5. 修复登录webview界面,放大镜穿透的问题;
6. 支持cpu指令集版本由arm7、arm7s、arm64、i386 、x86_64 变更到 armv7、x86_64、arm64
使用说明:请详见。
v3.1.0基础包更新了以下内容:
新增功能:
一键加群功能
修正以下功能:
1. 修正 log 文件从 document 目录移到Caches目录;
2. 修正通过h5 登录,分享到手Q提示账号不符合;
3. 修正分享到群部落;
4. 修正sdk添加游戏好友获取好友设置失败;
5. 修复登录webview界面,放大镜穿透的问题;
6. 支持cpu指令集版本由arm7、arm7s、arm64、i386 、x86_64 变更到 armv7、x86_64、arm64
说明:精简包不单独附上sample,具体接口的调用方式请参见完整包
V2.3.9d for Android插件版更新了如下内容:
1. 优化更新SDK相关接口;
2. 支持H5页面可调用原生SDK支付。
如何调用移动支付API,请详见 。
V1.2.0新版发布如下内容:
1. 支持移动、联通、电信sdk三网融合;
2. 支持数据统计上报功能;br&
3. 支付体验优化。
V1.1新版发布如下内容:
1. 集成下载应用宝android客户端、调起应用宝android客户端内应用更新页;
2. 集成在应用宝内下载省流量更新功能。
本SDK由开发者张善友贡献,如有疑问请联系作者。
使用说明:详见。当下软件园 / 汇聚当下最新最酷的软件下载站!
热门搜索:
您的位置:
> Java SE Runtime Environment(JRE) 9 Update 100 多语官方版
Java SE Runtime Environment(JRE) 9 Update 100 多语官方版
网友评分:10分
  Java SE Runtime Environment是一款运行J***A程序不可缺少的环境,只要你拥有Java软件,就可以直接进入一个全新的互动世界。
  JRE中由ClassLoader负责查找和加载程序引用到的类库,基础类库ClassLoader会到rt.jar中自动加载,其它的类库,ClassLoader在环境变量CLASSPATH指定的路径中搜索,按照先来先到的原则,放在CLASSPATH前面的类库先被搜到,Java程序启动之前建议先把PATH和CLASSPATH环境变量设好,OS通过PATH来找JRE,确定基础类库rt.jar的位置,JRE的 ClassLoader通过CLASSPATH找其它类库。
  但有时候会出现这样的情况,希望替换基础类库中的类库,那么也可以简单的通过 -Djava.endrosed.path=&参数传递给java.exe,于是ClassLoader会先于基础类库使用 java.endrosed.path参数指定路径的类库。因此Java的版本管理是非常简单有效的,也许很原始,不过很好用,简单就不容易出错。
JRE更新日志:
  Java SE Runtime Environment Ver 7.0.400.43
  此更新版本包含了Java应用的重要增强功能:
  &改进性能和稳定性
  &Java HotSpot VM 20
  & 支持Internet Explorer 9, Firefox 4 和Chrome 10
  & 改进BigDecimal的BigDecimal Olson Data 2011b
  &Java SE 6u25 contains Olson time zone data version 2011b
  多国语言版,支持简体中文界面。
软件特别说明
  当下提示:java se runtime environment 32 为32位操作系统专用,需要的朋友可以点击软件名进入下载页
Adobe Dreamweaver CS3 是建立 Web 站点和应用程序的专业工具。它将可视布局工具、应用程序开发功能和代码编辑支持组合在一起,其功能强大,使得各个层次的开发人员和设计人员都能够快速创建界面吸引人的基于标准的网站和应用程序。
Visual FoxPro 6.0简称VFP6.0,VFP6.0官方下载是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
VC++ 是具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言的c语言编程软件。
NET Framework是用于Windows的新托管代码编程模型。它强大功能与新技术结合起来,用于构建具有视觉上引人注目的用户体验的应用程序,实现跨技术边界的无缝通信
RPG Maker XP系列软件是日本 Enterbrain 公司开发的RPG游戏制作软件,可以使一个不懂编程的人也能做出精美的 RPG游戏。
其他版本下载
Java SE Runtime Environment(JRE) 9 Update 100 多语官方版
Copyright (C)
.All rights reserved.android平台接入服务器总结(一)腾讯qq应用宝接入
腾讯开放平台的接入是非常麻烦的, ,腾讯开放平台的文档很多很杂,社交功能的api接口也很多还有。我现在只接了他的登录跟支付。
一、登录。
登录相对来讲还是比较简单的,首先前端sdk要正确接入获取access_token
跟 openid ,然后需要一个https
方式的get请求来取得进一步的信息。
url :/user/get_simple_userinfo?oauth_consumer_key=%s&access_token=%s&openid=%s&clientip=&oauth_version=2.a&scope=all
填写好自己应用的所有内容。https协议的java实现
import java.io.BufferedR
import java.io.DataOutputS
import java.io.IOE
import java.io.InputStreamR
import java.net.HttpURLC
import java.net.URL;
import java.util.M
import java.util.Map.E
import javax.net.ssl.HostnameV
import javax.net.ssl.HttpsURLC
import javax.net.ssl.SSLS
import org.apache.http.HttpE
import org.apache.http.HttpR
import org.apache.http.client.ClientProtocolE
import org.apache.http.client.methods.HttpP
import org.apache.http.entity.ByteArrayE
import org.apache.http.impl.client.DefaultHttpC
import org.apache.http.params.HttpConnectionP
import org.apache.http.params.HttpP
import org.slf4j.L
import org.slf4j.LoggerF
public class MyhttpService {
int read_time_out = 10000;
private Logger logger = LoggerFactory.getLogger(MyhttpService.class);
public MyhttpService() {
public MyhttpService(int time_out) {
read_time_out = time_
public String doPost(String url, Map params){
StringBuilder postData = new StringBuilder();
for(Entry entry:params.entrySet()){
if(postData.length()!=0){
postData.append("&");
postData.append(entry.getKey()).append("=").append(entry.getValue());
return service(false, url, postData.toString(), "POST", null);
public String doPost(String url, Map params,Map headers){
StringBuilder postData = new StringBuilder();
for(Entry entry:params.entrySet()){
if(postData.length()!=0){
postData.append("&");
postData.append(entry.getKey()).append("=").append(entry.getValue());
return service(false, url, postData.toString(), "POST", headers);
public String doPost(String url,String body){
return service(false, url, body, "POST", null);
public String doPost(String url, String postData, Map headers){
return service(false, url, postData, "POST", headers);
public String doGet(String url, Map headers){
return service(false, url, null, "GET", headers);
public String doGet(String url){
return service(false, url, null, "GET", null);
public String doHttpsPost(String url, String postData) {
return service(true, url, postData, "POST",null);
public String doHttpsPost(String url, Map params){
doHttpsPost(url,params,null);
public String doHttpsPost(String url, Map params,Map headers){
StringBuilder postData = new StringBuilder();
for(Entry entry:params.entrySet()){
if(postData.length()!=0){
postData.append("&");
postData.append(entry.getKey()).append("=").append(entry.getValue());
return service(true, url, postData.toString(), "POST", headers);
public String doHttpsGet(String url) {
return service(true, url, null, "GET",null);
private String service(boolean isHttps, String url, String postData, String method, Map headers){
HttpURLConnection conn =
boolean doOutput = postData != null && postData.equals("");
conn = isHttps ? createHttpsConn(url, method, doOutput) : createHttpConn(url, method, doOutput);
fillProperties(conn, headers);
if(doOutput) writeMsg(conn, postData);
String msg = readMsg(conn);
logger.debug(msg);
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
} finally {
if (conn != null) {
conn.disconnect();
private HttpURLConnection createHttpConn(String url, String method, boolean doOutput) throws IOException {
URL dataUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) dataUrl.openConnection();
conn.setReadTimeout(read_time_out);
conn.setRequestMethod(method);
conn.setDoOutput(doOutput);
conn.setDoInput(true);
public static void main(String[] args) {
System.out.println(DigestUtils.md5DigestAsHex("19a98d31--b7cd-129e8ddaliji11899CNY68appstoreQY7road-16-WAN-0668ddddSHEN-2535-7ROAD-shenqug-lovedede77".getBytes()));
private String readMsg(HttpURLConnection conn) throws IOException {
return readMsg(conn, "UTF-8");
private String readMsg(HttpURLConnection conn, String charSet) throws IOException {
BufferedReader reader =
reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), charSet));
StringBuilder sb = new StringBuilder();
String line =
while ((line = reader.readLine()) != null) {
sb.append(line);
return sb.toString();
} finally {
if(reader != null){
reader.close();
private void writeMsg(HttpURLConnection conn, String postData) throws IOException {
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.write(postData.getBytes());
dos.flush();
dos.close();
private void fillProperties(HttpURLConnection conn, Map params) {
if(params == null||params.isEmpty()){
for (Entry entry: params.entrySet()) {
conn.addRequestProperty(entry.getKey(), entry.getValue());
public String httpsPost(String url, String postData) {
HttpURLConnection conn =
boolean doOutput = (postData != null && postData.equals(""));//!Strings.isNullOrEmpty(postData);
conn = createHttpsConn(url, "POST", doOutput);
if (doOutput)
writeMsg(conn, postData);
return readMsg(conn);
} catch (Exception ex) {
// just print out
logger.error(ex.getMessage(), ex);
} finally {
if (conn != null) {
conn.disconnect();
private HttpURLConnection createHttpsConn(String url, String method, boolean doOutput) throws Exception {
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
HttpsURLConnection.setDefaultHostnameVerifier(hv);
trustAllHttpsCertificates();
URL dataUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) dataUrl.openConnection();
conn.setReadTimeout(read_time_out);
conn.setRequestMethod(method);
conn.setDoOutput(doOutput);
conn.setDoInput(true);
private static void trustAllHttpsCertificates() throws Exception {
Create a trust manager that does not validate certificate chains:
javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
javax.net.ssl.TrustManager tm = new miTM();
trustAllCerts[0] =
javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, null);
javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(
sc.getSocketFactory());
public static class miTM implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
public boolean isServerTrusted(
java.security.cert.X509Certificate[] certs) {
public boolean isClientTrusted(
java.security.cert.X509Certificate[] certs) {
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType) throws
java.security.cert.CertificateException {
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) throws
java.security.cert.CertificateException {
* 执行一个HTTP POST请求,返回请求响应的内容
* @param url
请求的URL地址
* @param params 请求的查询参数,可以为null
* @return 返回请求响应的内容
public static String doPostforUC(String url, String body) {
StringBuffer stringBuffer = new StringBuffer();
HttpEntity entity =
BufferedReader in =
HttpResponse response =
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpParams params = httpclient.getParams();
HttpConnectionParams.setConnectionTimeout(params, 20000);
HttpConnectionParams.setSoTimeout(params, 20000);
HttpPost httppost = new HttpPost(url);
httppost.setHeader("Content-Type", "application/x-www-form-urlencoded");
httppost.setEntity(new ByteArrayEntity(body.getBytes("UTF-8")));
response = httpclient.execute(httppost);
entity = response.getEntity();
in = new BufferedReader(new InputStreamReader(entity.getContent(),"UTF-8"));
while ((ln = in.readLine()) != null) {
stringBuffer.append(ln);
stringBuffer.append("\r\n");
httpclient.getConnectionManager().shutdown();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
} catch (IllegalStateException e2) {
e2.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != in) {
in.close();
} catch (IOException e3) {
e3.printStackTrace();
return stringBuffer.toString();
内容的返回是json格式的,可以从里面找自己需要的内容来解析
JSONParser jsonParser = new JSONParser(JSONParser.DEFAULT_PERMISSIVE_MODE);
obj = (JSONObject) jsonParser.parse(doHttpsGet);
String code = String.valueOf(obj.get("ret"));
if(code.equals("0")){
String nickName = String.valueOf(obj.get("nickname"));后面就是自己服务器的逻辑了。登录相对来讲还是很简单的。
1、腾讯的支付接口不知道是新开发的,还是涉及太多,总之非常乱,他们的开放平台的wiki上面有,四个服务,应用接入,移动接入,网站接入,腾讯云接入。因为我们是移动游戏所以,应该按照移动接入来接,但是实际上还要涉及应用接入这边的文档。只看一边的文档会发现少很多东西。按照文档接入出现问题。正题。
我手中的文档是 移动接入的sdk里面的
,腾讯的支付有两种:第一种是由腾讯来管理我们的支付,举例就是玩家充值的元宝在腾讯服务器上面,这个蛋疼的地方是,以后你所有的元宝操作都要跟腾讯交互,增加、扣除、赠送等等都要写协议去腾讯云处理。所以我们用了另外一种模式,道具购买模式。道具购买模式是直接花q点或者q币购买我们的道具,这个道具就是元宝。
2、这里有一个问题是,sdk里面自带的文档跟wiki上面的不一致,调用的接口也不是一个
这个对我们的影响在于后面的发货接口。发货接口的文档又再wiki上面,所以后面我们回到wiki的时候发现两份文档对不上。sdk文档包括腾讯托管跟我们自己管理元宝两种,第一种因为接口多,所以大部分是将第一种方式的。
3、道具购买服务器需要实现两个接口。购买道具下订单接口。购买结束回调接口。
下单接口需要客户端在登录时候取得
然后按照文档以
方式连接开放api就可以了。
//qq直接购买道具下单界面
public String qq_buy_items(String appid,String sessionId ,String openid,String pay_token,String openkey ,String amount,String pf,String pfkey){
String appkey = PlatformUtil.QQ_APPKEY;
String apiaddress = "119.147.19.43";//qq测试地址
String apiaddress = "";//qq正式
//pf = "qq_m_qq--android-1";
//pfkey = "pfkey";
OpenApiV3 openApiV3 = new OpenApiV3(appid, appkey, apiaddress);
String zoneid="1";
Map params = new HashMap();
params.put("openid", openid);
params.put("openkey", openkey);
params.put("pf", pf);
params.put("pfkey",pfkey);
params.put("ts", String.valueOf(System.currentTimeMillis()/1000));
params.put("pay_token", pay_token);
params.put("zoneid", zoneid);
params.put("appmode", "1");
params.put("appid", appid);
int iamount = SCUtils.calcScCount(amount+".0");
String payitem = String.format("100*1*%s",String.valueOf(iamount));
String goodsmeta = "元宝*元宝";
String goodsurl = "http://dragon./other/CH.png";
String app_metadata = String.format("%s-%s-",sessionId,String.valueOf(amount));
params.put("payitem", payitem);
params.put("goodsmeta", goodsmeta);
params.put("goodsurl", goodsurl);
params.put("app_metadata",app_metadata);
//这个在最终透传时候会增加腾讯的内容,*qdqd*qq 告诉我们是用什么方式支付的
params.put("qq_m_qq",String.format("%s,%s,%s", appid,openid,openkey) );
Map cookies = new HashMap();
cookies.put("session_id", SnsSigCheck.encodeUrl("openid"));
cookies.put("session_type", SnsSigCheck.encodeUrl("kp_actoken"));
cookies.put("org_loc ",SnsSigCheck.encodeUrl("/mpay/buy_goods_m"));
String api = openApiV3.api("/mpay/buy_goods_m", params,null ,"http");
} catch (OpensnsException e) {
log.error("openApiV3.api invoke failed",e);
return "error";
OpenApiV3 其实可以从开放平台下载,是
http://wiki./wiki/SDK%E4%B8%8B%E8%BD%BD
里面其实是一些验证以及http的访问。实际接入时候可以下载一个最新的看看。返回值也是一个json
JSONParser jsonParser = new JSONParser(JSONParser.DEFAULT_PERMISSIVE_MODE);
obj = (JSONObject) jsonParser.parse(payurl);
int ret = (Integer) obj.get("ret");
String msg = (String) obj.get("msg");
String token_id = (String) obj.get("token");
String url_params = (String) obj.get("url_params");关于返回值里面参数,文档跟实际的返回有些出入,不一致,token 文档中写的是token_id
但实际返回的是token,这个可以实际debug看下再接收参数。得到的这些值需要发送给前端的sdk,前端的sdk会用这个返回的url 处理剩下的逻辑。
4、支付回调。客户端拿到刚才的url 会回传给腾讯,然后腾讯会调用我们在后台配置的回调接口,来通知支付结果,同时我们也要处理道具发放逻辑。这里有一个非常困难的问题 https协议的***问题。 腾讯的***最变态的一点是绑定ip地址,当然也是为了安全考虑。腾讯的后台我没有登录,但是应该是配置回调的ip地址,填写回调url
然后腾讯会生成一个绑定ip地址的***,你需要***这个***在那台服务器上面,
发货URL用来给腾讯计费后台回调。用户付费成功后,腾讯计费后台将回调该URL给用户发货。在9001端口后可以是一个cgi或者php的路径。
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端口(外网端口)。
-必须填写发货服务器所在运营商(电信/联通)。
这是腾讯官方文档对于这个的解释,总之很麻烦的一个东西,中间遇到什么问题,建议找他们的企业支持。
5、***的***。
******很坑爹的一个没有官方文档,官方有一个window的导入文档,没有linux的。这太无语了。
***的***可以***在apache 或者 nginx 下面,我没有直接***在tomcat下面,应该也是可以的吧,用apache或者nginx 可以做转发,转发到本地debug什么的。所以,我们用的是nginx做转发。首先腾讯后台下载一个这样的***包。
这个里面带钥匙的那个需要密码,密码在readme里面,但是其实linux下面并没有用到,这个我估计是原始的密钥文件,可以和那个key生成 crt 文件,但是这里已经是生成好了的 crt 文件所以还是直接用比较好,先给第一个最长的那个起个别的名字。然后上传到 nginx 服务器的 conf 目录下面 ,nginx 在***服务的时候应该是默认为支持https的 ssl 的,所以一般是不需要重新编译的,如果需要重新编译,可以去网上找找相关资料。如果你的
支持,那么就剩下一步,修改配置文件。
同样是conf目录下面的
nginx.conf
ssl_certificate
ssl_certificate_key
ssl_verify_
ssl_session_timeout
ssl_protocols
SSLv2 SSLv3 TLSv1;
ssl_ciphers
ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_
ssl_client_certificate
ssl_verify_depth
location ~
^/xxxxxr/* {
proxy_pass http://xxxxxx3;
index. index. index.
proxy_set_header
proxy_set_header
proxy_set_header
X-Forwarded-For $proxy_add_x_forwarded_
里面的ssl_client_certificatessl_certificate对应***里面的名字,修改完成后记得reload
./nginx -s reload
一下应该就生效了,我是做了转发本地处理的,当然也可以转发到任意服务器或者本机。如果下订单成功但是收不到回调,多半是这个***的问题,可以看 nginx的log日志看看有没有访问到。如果没有80%都是***的问题,询问下腾讯的支持让他们帮你查下日志吧,不过等他们反馈,估计你已经找到原因了。
6、支付回调的验证,当你终于能收到回调了,恭喜你你就要成功了。
对于支付回调的处理,其实很简单,但是腾讯的就很蛋疼。这就是上面说的蛋疼的问题,没有文档。sdk里面的文档说去看 wiki ,wiki里面的文档貌似不是这一版的,而且sdk文档里面的连接还是去 wiki 的主页,哎。
这里忍不住吐槽太多太乱,大家看上去都差不多,我哪知道是我需要的接口。最终我看到这个貌似像 :
http://wiki./wiki/%E5%9B%9E%E8%B0%83%E5%8F%91%E8%B4%A7URL%E7%9A%84%E5%8D%8F%E8%AE%AE%E8%AF%B4%E6%98%8E_V3
这个文档上面的参数回调,大部分都是正确的。注意是大部分,因为收到的所有参数都要参与 HmacSHA1 签名,所以一个参数错误就悲剧了,你都不知道去哪里找,贴一下我最终的回调处理。
//qq支付回调接口,根据http://wiki./wiki/%E5%9B%9E%E8%B0%83%E5%8F%91%E8%B4%A7URL%E7%9A%84%E5%8D%8F%E8%AE%AE%E8%AF%B4%E6%98%8E_V3
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
response.setContentType("text/charset=UTF-8");
PrintWriter out = response.getWriter();
Map obj = new HashMap();
String openid = request.getParameter("openid");
//根据APPID以及QQ号码生成,即不同的appid下,同一个QQ号生成的OpenID是不一样的。
String appid = request.getParameter("appid");
//应用的唯一ID。可以通过appid查找APP基本信息。
String ts = request.getParameter("ts");
//linux时间戳。 注意开发者的机器时间与腾讯计费开放平台的时间相差不能超过15分钟。
String payitem = request.getParameter("payitem");
//接收标准格式为ID*price*num
String token = request.getParameter("token");
//应用调用v3/pay/buy_goods接口成功返回的交易token
String billno = request.getParameter("billno");
//支付流水号(64个字符长度。该字段和openid合起来是唯一的)。
String version = request.getParameter("version");
//协议版本 号,由于基于V3版OpenAPI,这里一定返回“v3”。
String zoneid = request.getParameter("zoneid");
//在支付营销分区配置说明页面,配置的分区ID即为这里的“zoneid”。
如果应用不分区,则为0。
String providetype = request.getParameter("providetype");//发货类型
0表示道具购买,1表示营销活动中的道具赠送,2表示交叉营销任务集市中的奖励发放。
//Q点/Q币消耗金额或财付通游戏子账户的扣款金额。可以为空 若传递空值或不传本参数则表示未使用Q点/Q币/财付通游戏子账户。注意,这里以0.1Q点为单位。即如果总金额为18Q点,则这里显示的数字是180。
String amt = request.getParameter("amt");
String payamt_coins = request.getParameter("payamt_coins");//扣取的游戏币总数,单位为Q点。
String pubacct_payamt_coins = request.getParameter("pubacct_payamt_coins");//扣取的抵用券总金额,单位为Q点。
String appmeta = request.getParameter("appmeta");
String clientver = request.getParameter("clientver");
String sig = request.getParameter("sig");
String url = "/xxx/xxxx";
Map params = createCallbackParamsMap(openid, appid, ts, payitem, token, billno, version, zoneid,
providetype, amt, payamt_coins, pubacct_payamt_coins, appmeta,clientver);
if(SnsSigCheck.verifySig(request.getMethod(), url,params, PlatformUtil.QQ_APPKEY+"&", sig)){
obj.put("ret", 0);
obj.put("msg", "ok");
("qqPayCallback SnsSigCheck fail.");
obj.put("ret", -5);
obj.put("msg", "签名错误");
String resp = JSONObject.toJSONString(obj);
out.println(resp);
} catch (SQLException | DbException | ProtocolException | NumberFormatException | OpensnsException e) {
e.printStackTrace();
} finally {
out.close();
}中间标红的地方都是有问题的地方,都是坑。首先 pubacct_payamt_coins是有可能传空的,因为你没有用抵用券对吧,但是记住这个也需要加入签名。
神坑。我最终也没再文档或者哪里找到这个参数为什么给我传过来,但是你就是传过来了,而且你还必须接收,必须加入签名中去,也许我水平太菜,反正我是没找到这个参数在那个文档上面写了。
createCallbackParamsMap
字面意思就是把参数弄到 map里面
SnsSigCheck.verifySig
这也是上面下载的那个工具项目中自带的功能,其实就是一个
的 utf 格式的签名。可以下载,有兴趣的也可以自己写写。
(三)总结
腾讯的支付接口应该做的不难,困难在于没有一个明确的文档。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'

参考资料

 

随机推荐