https://www.battlenet.com.cn/shop/zh/product/world-of-warcraft-game-time-cn。xamarin test cloud (https://xamarin.com/test-cloud/)testdroid ()sauce labs (https://saucelabs.com/mobile/)google cloud test cloud (https://developers.google.com/cloud-test-lab/)aws device farm (https://aws.amazon.com/device-farm/)。failed to fetch url https://dl-ssl.google.com/glass/gdk/addon.xml, reason: httphostconnect connection to https://dl-ssl.google.com refused。
对于不同服务器对应不同的证书格式以及方法可以参考下面连接
https://www.wosign.com/support/ssl-install-index.htm
以tomcat服务器为例:
修改server.xml将默认的localhost访问修改为https+域名访问
以下几点一开始可能一头雾水,不知道该如何配置,可以先放一放,等开发到相应步骤自然需要填写
需要配置的2个平台地址
商户平台:https://pay.weixin.qq.com/
公众平台:https://mp.weixin.qq.com/
2.配置微信支付目录
//业务结果 参考链接:https://pay.weixin.qq.com/wiki/doc/api/wap.php。官方文档:https://seleniumhq.github.io/selenium/docs/api/py/api.html。官方安装介绍文档:https://github.com/netease/pomelo/wiki/%e5%ae%89%e8%a3%85pomelo。
假设调用微信H5支付页面的地址为https://a.b.com/pay
那么:授权目录配置为https://a.b.com/
3.配置微信公众号域名(业务域名、JS接口安全域名、网页授权域名)
参考官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_3
4.API安全密钥
支付签名所需要拼接的参数,即后文sign拼接所需要的key
参考官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
5.下载商户证书
//业务结果 参考链接:https://pay.weixin.qq.com/wiki/doc/api/wap.php。官方文档:https://seleniumhq.github.io/selenium/docs/api/py/api.html。官方安装介绍文档:https://github.com/netease/pomelo/wiki/%e5%ae%89%e8%a3%85pomelo。
退款需要调用商户证书进行验证
Java环境采用apiclient_cert.p12 证书密码为商户号
其中红色部分是需要我们开发的地方,其余部分均为微信功能
其中public void pay(string name, string msg, string orderno, string money,final handler handler) 方法是调用支付是用到的,传的参数为商户的名字,商品计费名称,订单号和价格,最后一个handler handler参数是用来接收支付回调发送消息的。微信app会返回到商户app并回调onresp函数,开发者需要在该函数中接收通知,。商户app调用微信提供的sdk调用微信支付模块,商户app会跳转到微信中完成支付,。
我们所需要做的事情:
1.获取用户授权,拿到openId
2.调用微信统一下单接口获取预支付id
3.将数据发送给前台微信支付java开发详细,调用微信内置JS唤起支付控件
4.支付完成后,微信回调URL的处理
5.微信后台异步通知商户支付结果,商户收到消息后需要告知微信处理结果
6.根据功能需求的其他业务逻辑,比如DB的交互之类
1.获取用户授权,拿到openId
参考官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
这篇官方文档介绍的还是比较详细的,可以仔细研究下
大概流程如下:
第一步:用户同意授权,获取code
访问如下链接:
//业务请求参数的集合,最大长度不限,除公共参数外所有请求参数都必须放在这个参数中传递,具体参照各产品快速接入文档 。所谓隐藏参数,就是没有官方文档对其含义进行说明的参数。官方捐助链接,由官方注册说明页面点击跳转而来,官方店铺只有这一个,从来没有授权过任何其他店铺,购买请认准地址,我们只提供注册码注册。
参数顺序必须正确。
1)用户同意授权,获取code。这主要是针对一些作弊行为所做的恶意跳转,即所打开的页面并非用户希望看到的页面,而是近一步自动转向了其他页面非用户点击的页面行为。2 控制会员点击加入购物车按钮之后页面跳转到哪里,例如有三个选择,第一就是不跳转页面直接加入购物车,第二就是本页面跳转到购物车页面,第三就是不跳转页面直接加入购物车页面。
redirect_uri一般为controller,拿到code后在其中做后续步骤,如wxpay.xxx.com/wechat/unifiedOrder
code说明: code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
第二步:通过code换取网页授权access_token
2. 你无法将后台通信逻辑放到controller中实现,而要放到factory中。一些需要公用的逻辑,如果放在controller中,都会相当别扭,就这样被angular“逼着”,把公用逻辑都放到directive、filter、factory中去。回调是异步编程最基本的方法,比如nodejs中,需要按顺序执行异步逻辑的时候,一般采用后续传递的方式,也就是将后续逻辑封装在回调函数中作为起始函数的参数,逐层去嵌套,利用这种方式来让程序按照我们所期望的方式走完整个流程。
String code = request.getParameter("code");
获取code后,请求以下链接获取access_token:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
返回数据为JSON,具体含义参照官方文档
我这里采用了jackson工具将json转化为实体类进行操作,代码如下:
获取返回数据的工具类:
public static AuthToken getTokenByAuthCode(String code) {
AuthToken authToken = null;
StringBuilder json = new StringBuilder();
try {
URL url = new URL(Constant.Authtoken_URL(code));
URLConnection urlConnection = url.openConnection();
urlConnection.connect();
BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
json.append(inputLine);
}
in.close();
// 将json文本转化为authToken对象
authToken = jsonToEntity(json.toString(), AuthToken.class);
} catch (IOException e) {
logger.error("*****获取access_token异常*****");
e.printStackTrace();
}
return authToken;
}
Json转化实体类工具类:
public static <T> T jsonToEntity(String jsonString, Class<T> entityType) {
T entity = null;
try {
entity = jsonObjectMapper.readValue(jsonString, entityType);
} catch (Exception e) {
logger.error("*****json转化异常*****");
e.printStackTrace();
}
return entity;
}
AuthToken是返回数据的实体类
2.调用微信统一下单接口获取预支付id
简单的理解就是调用一个微信的API接口,它需要很多的参数,赋值拼接后转化为XML格式发送给微信,微信再返回我们XML格式的响应报文。
由于参数很多并且复杂,开发前一定要详读官方API文档。
参考官方文档https://mp.weixin.qq.com/wiki?。 * api地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php。https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php。
下面对用到的字段做具体的讲解(注意大小写!):
appid==公众账号ID==微信公众号后台查看
mch_id==商户号==微信支付平台查看
device_info==设备号==公众号支付传“WEB”
nonce_str==32位随机字符串==微信支付API接口协议中包含字段nonce_str,主要保证签名不可预测。生成code如下:
public static String generateUUID() {
return UUID.randomUUID().toString().replace("-", "").substring(0, 32);
}
sign==签名==先跳过,等其他参数赋值结束后再讲sign
sign_type==签名类型==采用“MD5”
body==商品描述==传中文可能出现问题,注意UTF-8编码
attach==附加数据==在查询API和支付通知中原样返回,可作为自定义参数使用
out_trade_no==商户订单号==商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@,且在同一个商户号下唯一。
我采用的是当前14位系统时间+4位随机数构成订单号,代码如下:
/**
* 生成订单号 yyyyMMddHHmmss+4位随机数 共18位
* 适用于订单号和退款单号
*/
public static String generateOut_trade_no() {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String format = sdf.format(date);
Random random = new Random();
String result = "";
for (int i = 0; i < 4; i++) {
result += random.nextInt(10);
}
String finalResult = format + result;
logger.info("订单号:" + finalResult);
return finalResult;
}
fee_type==标价币种==默认“CNY”,可以不传
total_fee==标价金额==单位为分!!注意做元分转化
string ip=request.getremoteaddr()。ip pbx登录ims终端管理平台的账号、密码由用户在开户时获得微信支付java开发详细,并预置在ip pbx中。获取客户端ip,案例:封ip,request.getremoteaddr()。
time_start==交易起始时间==订单生成时间,格式为yyyyMMddHHmmss
当改签订单审核不通过时,订单状态由”改签订单,等待审核”变为”改签订单审核不通过,交易结束。当退票/废票订单审核不通过时,订单状态由”退票/废票订单,等待审核”变为”退票/废票订单审核不通过,交易结束”。正常情况下,双方的自由辩论结束时间相差不会超过半分钟,但辩论场上也常会出现一方时间剩余时间超过一分钟甚至两三分钟的情况,这是令辩手相当尴尬的事情,很影响士气。
notify_url==通知地址==异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。(现在可能不知道做什么用的,也不知道怎么配,没关系,等做到后面微信通知结果就豁然开朗了,可以先随便赋值)
trade_type==交易类型==公众号支付传“JSAPI”
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/sanxing/article-112419-1.html
再横起来也不迟