Java开发的应该如何掌握上述相关技术?
一:首先,有这样的一种情况很常见,对于想自学Java开发的人来说,他们
大多数都是非常盲目的,不知道自己改如何入手,很多人在网上找一些视频,然后疯狂的过视频,很快就把一块内容都学完,他们理解的学完了就是视
频看完了,但是让他们动手去做东西却做不出来,而我的理解学完了就是自己能写出东西,所以对于初学者来说一定不能盲目,要有自己的规划,不然
就是浪费时间白忙活。
二:既然是学习Java开发专业技术,我个人的建议是,一定要有一个能指导
你的人,不能都靠自己闭门造车,这样的行为并不聪明,结识一位这方面的人才,时不时去问问人家问题,不然你可能会发现一个小问题能困扰你一天
,**后还不知道是什么原因。
三:学习Java开发技术,不能跟学数学语文一样对待,比较刚接触代码是不
容易记住的,所以要掌握上述的技术,你还要知道学习Java开发技术有哪些“坑”。对于学习方法这块是尤为重要的,怎么学才能让你学完了能记住之
前学的那些,不至于学完了就忘,这个问题值得你学习之前去思考的。
四:根据我多年的学习情况来看,你平时一定要养成好的学习习惯,就说我
自己吧!我就喜欢把自己曾经遇到的问题整理在电脑的日记本上,然后我会搜集一下博客相关的Java技术文章,一些我认为比较有用的网站,以后都能
用的上,这是我个人的学习习惯,相信我,如果你想走的更远,一定要养成习惯。
**后给大家一些详细的学习安排路线:
Java基础:Java基础语法、数组、类与对象、继承与多态、异常、范型、集
合、流与文件、反射、枚举、自动装箱和注解。
数据库:mysql、oracle
Javaweb:HTML与CSS网页开发基础、Java脚本语言、搭建开发环境、JSP基
本语法、JSP内置对象、JavaBean技术、Servlet技术、Ajax技术
框架:Struts2、Hibernate、Spring、SpringMVC、mybatis
课程大纲
一阶段
|
二阶段
|
三阶段
|
-
语言基础、Java基础
-
Java多线程
-
Java网络编程
-
程序调试/单元测试
-
XML
-
数据库
-
数据结构与算法
|
|
-
设计模式
-
MyBatis
-
Redis
-
Spring
-
SpringBoot
-
JMS
-
SpringCloud
-
Docker
-
Java前沿技术 常用
企业解决方案
-
UML/OOD/OOP
|
微信公众号开发和微信支付
>
博客这么久没写了(因为女朋友(^__^) 嘻嘻……),今天决定把微信相关开发遇到的坑给大家分享一下,以免大家掉入坑浪费过多的时间!
我会在文章末尾上传一个开箱即用的微信公众号支付的demo,理论上来讲你只需要修改配置文件就可以支付了。
使用的技术:SPRingBoot、angularJs。
使用了一个第三方的微信mavne依赖: weixin-java-mp在pom可以看见,时过境迁可能weixin-java-mp版本更新了。weixin-java-mp的API:https://github.com/chanjarster/weixin-java-tools/wiki
mavne依赖在中央仓库可以查找:http://mvnrepository.com/
微信公众号配置
access.properties文件
该文件中主要配置公众号和微信支付相关参数,里面的信息在申请公众号和申请微信支付就会得到(开箱即用也就是修改这个配置文件里面的内容)
该工具类主要映射access.properties文件键的名称
读取access.properties文件的方式为: String appId=PropertyHandler.getInstance().getValue(SampleConstants.WEIXIN_APPID)
初始化配置公众号
/**
* 初始化微信配置
*/
public class WeiXinInitConfigUtil {
public static WxMpInMemoryConfigStorage wxMpConfigStorage;
public static WxMpService wxMpService;
public static WxMpMessageRouter wxMpMessageRouter;
public static WxMpOAuth2AccessToken wxMpOAuth2AccessToken;
//注意静态块,这里使用的是weixin-java-mp的API,直接对应配置文件填上去。
static {
WxMpInMemoryConfigStorage storage=new WxMpInMemoryConfigStorage();
storage.setAppId(PropertyHandler.getInstance().getValue(SampleConstants.WEIXIN_CORPID)); storage.setSecret(PropertyHandler.getInstance().getValue(SampleConstants.WEIXIN_CORPSECRET));
storage.setToken(PropertyHandler.getInstance().getValue(SampleConstants.WEIXIN_APP_APPID_TOKEN));
storage.setAesKey(PropertyHandler.getInstance().getValue(SampleConstants.WEIXIN_APP_APPID_AESKEY));
wxMpConfigStorage=storage;
wxMpService = new WxMpServiceImpl();
wxMpService.setWxMpConfigStorage(storage);
wxMpMessageRouter = new WxMpMessageRouter(wxMpService);
}
}
封装当前用户
用拦截器来配置需要的校验参数 。
/**
* Created by orange on 2016/10/27.
* 获取微信用户相关信息的拦截器,该拦截器将会过滤所有请求,进行是否包含 微信登录用户的判断。
*/
@Component
public class WxCpIntercepter implements HandlerInterceptor {
private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory.getLogger(WxCpIntercepter.class);
//在请求处理之前进行调用(Controller方法调用之前)
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String userAgent = request.getHeader("user-agent");
//获取session里面的用户对象
WxMpUser wxUser = (WxMpUser) request.getSession().getAttribute(SampleConstants.WEIXIN_USER);
//获取request中的code
String code = request.getParameter("code");
//当request请求里面有code,但是session里面没有weixinUser(登录微信用户),将会查询的微信用户封装到session中
if (code != null && wxUser == null) {
WxCpUtil.setUserIdForSession(request);
}
//设置微信校验参数到session中
WxCpUtil.openContact(request);
return true;// 只有返回true才会继续向下执行,返回false取消当前请求
}
//请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
//在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
对拦截器进行统一配置
/**
* Created by orange on 2016/10/27.
* 拦截器集中配置类
*/
@Configuration
public class FilterConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 多个拦截器组成一个拦截器链
// addPathPatterns 用于添加拦截规则
// excludePathPatterns 用户排除拦截
//这里可添加多个拦截器
registry.addInterceptor(new WxCpIntercepter()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
拦截器使用的WxCpUtil类代码
public class WxCpUtil {
private static final Logger logger = LoggerFactory.getLogger(WxCpUtil.class);
/**
* 判断用户是否关注了公众号
* @param token
* @param openid
* @return
*/
public static boolean judgeIsFollow(String token,String openid){
int zhi=0;
InputStream is=null;
String url = "https://api.weixin.QQ.com/cgi-bin/user/info?access_token=" token "&openid=" openid "&lang=zh_CN";
try {
URL urlGet = new URL(url);
HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();
http.setRequestMethod("GET"); // 必须是get方式请求
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.setDoOutput(true);
http.setDoInput(true);
http.connect();
is = http.getInputStream();
int size = is.available();
byte[] jsonBytes = new byte[size];
is.read(jsonBytes);
String message = new String(jsonBytes, "UTF-8");
//序列化json字符串
Gson gson = WxMpGsonBuilder.INSTANCE.create();
JsonObject jsonObject = (JsonObject)gson.fromJson(message, JsonObject.class);
//用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,1的时候表示关注了。
zhi = jsonObject.get("subscribe").getAsInt();
} catch (Exception e) {
e.printStackTrace();
}finally {
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return 1==zhi;
}
//获取设置微信用户
public static void setUserIdForSession(HttpServletRequest request) throws UnsupportedEncodingException {
//**code获取微信用户信息
String code = request.getParameter("code");
String state = request.getParameter("state");
logger.debug("code={}", code);
logger.debug("state={}", state);
String[] res = null;
try {
wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);
WxMpUser wxMpUser = wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, null);
String token = wxMpService.getAccessToken();
//判断用户是否关注
boolean flag = judgeIsFollow(token, wxMpUser.getOpenId());
if(!flag){//用户没有关注
//公众号让他关注
}
request.getSession().setAttribute(SampleConstants.WEIXIN_USER, wxMpUser);
} catch (WxErrorException e) {
e.printStackTrace();
}
}
//设置微信校验参数
public static void openContact(HttpServletRequest request) {
try {
String ip = request.getRemoteAddr();
logger.debug("ip地址={}",ip);
String urlStr = WxCpUtil.getFullURL(request);
logger.debug("request.getRequestURI() = {}", urlStr);
if (urlStr.indexOf("goto") > -1 || urlStr.indexOf("menu") > -1) {
WxJsapiSignature signature = wxMpService.createJsapiSignature(urlStr);
request.getSession().setAttribute("signature", signature);
}
} catch (WxErrorException e) {
e.printStackTrace();
try {
throw new ServletException();
} catch (ServletException e1) {
e1.printStackTrace();
}
}
}
public static String getFullURL(HttpServletRequest request) {
String SeverNameForURI = PropertyHandler.getInstance().getValue("SeverNameForURI");
String uri = request.getScheme() "://"
SeverNameForURI
request.getRequestURI()
(request.getQueryString() != null ? "?" request.getQueryString() : "");
return uri;
}
public static WxJsGroupSignature createGroupapiSignature(String url) throws WxErrorException {
String accerssToken=wxMpService.getAccessToken();
String zhi = wxMpService.getJsapiTicket();
JsonElement tmpJsonElement = (new JsonParser()).parse(zhi);
JsonObject tmpJsonObject = tmpJsonElement.getAsJsonObject();
String jsapiGroupErrcode = tmpJsonObject.get("errcode").getAsString();
String jsapiGroupId = tmpJsonObject.get("group_id").getAsString();
String jsapiGroupTicket = tmpJsonObject.get("ticket").getAsString();
long timestamp = System.currentTimeMillis() / 1000L;
String noncestr = RandomUtils.getRandomStr();
String signature = SHA1.genWithAmple(new String[]{"group_ticket=" jsapiGroupTicket, "noncestr=" noncestr, "timestamp=" timestamp, "url=" url});
WxJsGroupSignature jsGroupapiSignature = new WxJsGroupSignature();
jsGroupapiSignature.setTimestamp(timestamp);
jsGroupapiSignature.setNonceStr(noncestr);
jsGroupapiSignature.setUrl(url);
jsGroupapiSignature.setSignature(signature);
jsGroupapiSignature.setGroupId(jsapiGroupId);
jsGroupapiSignature.setGroupErrcode(jsapiGroupErrcode);
jsGroupapiSignature.setGroupTicket(jsapiGroupTicket);
jsGroupapiSignature.setAccessToken(accerssToken);
logger.debug("jsapiGroupErrcode=[{}],jsapiGroupId=[{}],jsapiGroupTicket=[{}],jsapiGroupSignature=[{}]", jsapiGroupErrcode, jsapiGroupId, jsapiGroupTicket, jsGroupapiSignature.getSignature());
return jsGroupapiSignature;
}
}
至此我们已经把公众号需要的配置全部封装到session里面去了,接下来我们只需要用Ajax向后台发起请求获取配置就好了。
微信支付配置
**步和第二步
微信支付平台地址:https://pay.weixin.qq.com/
微信公众平台地址:https://mp.weixin.qq.com/
**步在微信支付平台设置key:安全中心—->API安全
第二步在微信公众平台设置测试授权目录和测试白名单:微信支付—->开发配置(注意:授权目录一定要精确到调用html页面**后一级,比如你的支付页面url为:www.orange.com/pay/test/pay.html那么你的授权目录为:www.orange.com/pay/test/)
第三步
获取统一下单号和微信JSAPI需要参数。
统一下单号的说白了就是微信返回给你的订单号,JSAPI是需要这个订单号再次进行访问微信服务器的,微信服务器就根据这个订单号获取统一下单的详细信息包括,(多少钱,买了什么东西,等等….),然后调用微信的支付客户输入密码付钱。
这里有两点需要我们注意。
微信加密校验地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1
1、微信的加密方式:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
2、微信统一下单需要的参数:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
具体代码
@Controller
public class GetUnifiedOrderController {
/**
* @return 微信支付参数
*/
@ResponseBody
@RequestMapping("/GetUnifiedOrderController")
public WXPayBean GetUnifiedOrderController(HttpServletRequest request){
//生成订单xml String orderInfo=createOrderInfo(request);
//调用统一下单API,获取订单号
String prepay_id = httpOrder(orderInfo);
//生成**后支付的对象
WXPayBean wxpayBean = startPay(prepay_id);
return wxpayBean;
}
/**
* 生成订单XML
* @return
*/
private String createOrderInfo(HttpServletRequest request) {
String appId = PropertyHandler.getInstance().getValue(SampleConstants.WEIXIN_APPID);
String mchId = PropertyHandler.getInstance().getValue(SampleConstants.WEIXIN_MCHID);
String key = PropertyHandler.getInstance().getValue(SampleConstants.WEIXIN_KEY);
// orderId 商户订单号商户支付的订单号由商户自定义生成,微信支付要求商户订单号保持唯一性(建议根据当前系统时间加随机序列来生成订单号)。
// 重新发起一笔支付要使用原订单号,避免重复支付;已支付过或已调用关单、撤销(请见后文的API列表)的订单号不能重新发起支付。
String orderId=wxPayUtils.makeUUID();
//获取当前用户的openid
WxMpUser wxUser = (WxMpUser) request.getSession().getAttribute(SampleConstants.WEIXIN_USER);
String openid = wxUser.getOpenId();
//随机字符串
String uuid = wxPayUtils.makeUUID();
//根据规则创建可排序的map集合
SortedMap<String, Object> packageParams = new TreeMap<String, Object>();
packageParams.put("appid", appId);//公众账号ID
packageParams.put("mch_id",mchId);//商户号
packageParams.put("nonce_str",uuid);//随机字符串
packageParams.put("body","我是商品描述");//商品描述 注意加上<![CDATA[ ]]>保证解析器忽略解析里面的内容
packageParams.put("out_trade_no", orderId);//商户订单号
packageParams.put("total_fee",1);//金额需要扩大100倍:1代表支付的是0.01元
packageParams.put("spbill_create_ip","171.221.149.199");//用户IP地址
packageParams.put("notify_url", "1598m20l41.51mypc.cn/gotoMap/scanCoedOk");//通知地址
packageParams.put("trade_type", "JSAPI");//JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付
packageParams.put("openid",openid);//前用户的openid
//获取签名(使用工具类里面的加密方法,大家可以直接将工具类拷贝到自己的项目中使用)
String sign = wxPayUtils.md5Str(packageParams,key);
//拼接成一个xml。
String xml="<xml>"
"<appid>" appId "</appid>"
"<mch_id>" mchId "</mch_id>"
"<nonce_str>" uuid "</nonce_str>"
"<sign>" sign "</sign>"
"<body><![CDATA[" "我是商品描述" "]]></body>"
"<out_trade_no>" orderId "</out_trade_no>"
"<total_fee>" 1 "</total_fee>"
"<spbill_create_ip>" "171.221.149.199" "</spbill_create_ip>"
"<notify_url>" "1598m20l41.51mypc.cn/gotoMap/scanCoedOk" "</notify_url>"
"<trade_type>" "JSAPI" "</trade_type>"
"<openid>" openid "</openid>"
"</xml>";
return xml;
}
/**
* 调用统一下单API
* @param orderInfo
* @return
*/
private String httpOrder(String orderInfo) {
String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
try {
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
//加入数据
conn.setRequestMethod("POST");
conn.setDoOutput(true);
BufferedOutputStream buffOutStr = new BufferedOutputStream(conn.getOutputStream());
buffOutStr.write(orderInfo.getBytes());
buffOutStr.flush();
buffOutStr.close();
//获取输入流
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null;
StringBuffer sb = new StringBuffer();
while((line = reader.readLine())!= null){
sb.append(line);
}
//解析xml
SAXReader reader1 = new SAXReader();
reader1.setEncoding("utf-8");
Document document;
document = reader1.read(new ByteArrayInputStream(sb.toString().getBytes("UTF-8")));
Element element = document.getRootElement();//得到xml跟标签,此处是<root></root>
Element prepay_idElement = element.element("prepay_id");
String prepay_id = prepay_idElement.getData() "";
Element return_codeElement = element.element("return_code");
String return_code = return_codeElement.getData() "";
Element result_codeElement = element.element("result_code");
String result_code = result_codeElement.getData() "";
if("SUCCESS".equals(return_code)&&"SUCCESS".equals(result_code)){
//当都为SUCCESS的时候才将统一下单id返回出去
return prepay_id;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 设置微信支付**后一步所需要的参数
* @param prepay_id 统一支付id
* @return 支付对象
*/
private WXPayBean startPay(String prepay_id){
String appId = PropertyHandler.getInstance().getValue(SampleConstants.WEIXIN_APPID);
String key = PropertyHandler.getInstance().getValue(SampleConstants.WEIXIN_KEY);
WXPayBean wxPayBean=new WXPayBean();
String timeStamp = String.valueOf((System.currentTimeMillis() / 1000));//1970年到现在的秒数
String nonceStr =wxPayUtils.makeUUID();//随机字符串
String signType = "MD5";
SortedMap<String, Object> packageParams = new TreeMap<String, Object>();
packageParams.put("appId",appId);//注意这里的appId中的I是大写的喔不要弄错了。
packageParams.put("timeStamp",timeStamp);
packageParams.put("nonceStr",nonceStr);
packageParams.put("signType",signType);
packageParams.put("package","prepay_id=" prepay_id);
//获取签名(用同样的方式加密)
String paySign = wxPayUtils.md5Str(packageParams, key);
//封装微信支付实例
wxPayBean.setTimeStamp(timeStamp);
wxPayBean.setNonceStr(nonceStr);
wxPayBean.setPackage_("prepay_id=" prepay_id);
wxPayBean.setSignType(signType);
wxPayBean.setPaySign(paySign);
return wxPayBean ;
}
}
至此我们已经封装完成微信支付需要的全部配置,等待JSAPI向我们请求数据就好了。
工具类wxPayUtils代码
/**
* Created by orange on 2017/1/19.
* 微信支付工具类
*/
public class wxPayUtils {
/**
*
* @param params 需要签名的参数,键值对
* @param key (支付平台的安全密钥)key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
* @return MD5加密后转换为大写返回
*/
public static String md5Str(SortedMap<String, Object>params,String key){
//**步 键按照字典序
StringBuffer sb = new StringBuffer();
Set es = params.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = entry.getKey() "";
String v = entry.getValue() "";
//为空不参与签名、参数名区分大小写
if (null != v && !"".equals(v) && !"sign".equals(k)
&& !"key".equals(k)) {
sb.append(k "=" v "&");
}
}
//第二步拼接key
sb.append("key=" key);
//MD5加密 转换为大写返回
String sign="";
try{
String zhi = new String(sb.toString().getBytes("UTF-8"));
sign=getMd5Str(zhi).toUpperCase();
}catch (UnsupportedEncodingException e){
e.printStackTrace();
}
return sign;
}
/**
* 时间戳和随机数创建UUID
* @return
*/
public static synchronized String makeUUID() {
Date date = new Date();
String dateStr = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(date) "";
StringBuffer s = new StringBuffer(dateStr);
return s.append((new Random().nextInt(900) 100)).toString();
}
//MD5加密
public static String getMd5Str(String sourceStr){
String result = "";
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(sourceStr.getBytes());
byte b[] = md.digest();
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset ) {
i = b[offset];
if (i < 0)
i = 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
result = buf.toString();
System.out.println("MD5(" sourceStr ",32) = " result);
System.out.println("MD5(" sourceStr ",16) = " buf.toString().substring(8, 24));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return result;
}
}
微信支付JS
微信SDK说明:https://mp.weixin.qq.com/wiki
<!DOCTYPE html>
<html lang="en">
<head>
<title>微信支付</title>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, minimum-scale=1.0"/>
<meta http-equiv="Access-Control-Allow-Origin" content="*"/>
<meta name="description" content="" />
<meta name="author" content="" />
<link href="/CSS/mycss.css" rel="stylesheet" />
<script src="//cdn.bootcss.com/angular.js/1.5.7/angular.min.js"></script>
<script src="//cdn.bootcss.com/angular.js/1.5.7/angular-animate.min.js"></script>
<script src="//cdn.bootcss.com/angular.js/1.5.7/angular-resource.min.js"></script>
<script src="//cdn.bootcss.com/angular.js/1.5.7/angular-route.min.js"></script>
<script src="//cdn.bootcss.com/angular.js/1.5.7/angular-messages.min.js"></script>
<script src="//cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
<script src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js" type="text/Javascript"></script>
<script src="//cdn.bootcss.com/zepto/1.1.6/zepto.min.js"></script>
<script src="/js/pay/pay.js"></script>
<script>
var myApp=angular.module("myApp",[]);
myApp.controller("myController",function ($scope,$location,$http) {
//获取微信js配置签名(后台java类:ContacterController.java)
var url="/getContacter";
var parObj={}
//这里可以使用AJAX替换就是向后台请求数据。(这是angular的写法)
$http.get(url,{params:parObj}).success(function(wxParm) {
if(wxParm.success){
//设置微信支付的配置
getPay(wxParm);
}
});
//获取微信支付配置参数
function getPay(wxParm) {
//(后台java类:GetUnifiedOrderController.java)
var url="/GetUnifiedOrderController";
var parObj={}
//这里可以使用AJAX替换就是向后台请求数据。(这是angular的写法)
$http.get(url,{params:parObj}).success(function(payParm) {
console.log(payParm);
//调用pay.js的方法
wxconfigMap(wxParm,payParm);
});
}
});
</script>
</head>
<body ng-app="myApp" ng-controller="myController">
<h1>正在打开微信支付接口.....</h1>
</body>
</html>
pay.js代码
/**
* Created by orange on 2016/11/16.
*/
var wxmap;//全局参数map包含微信初始化相关参数
var paymap; //微信支付的相关参数
//设置微信相关参数
function wxconfigMap(wxParm,payParm){
wxmap=wxParm;
paymap=payParm;
wx.config({
debug: false,
appId: wxxxxxxx ,
timestamp: wxmap.time,
nonceStr: wxmap.randomStr,
signature:wxmap.signature,
jsApiList: [
chooseWXPay
]
});
}
//微信接口设置完毕回调方法
wx.ready(function () {
wx.chooseWXPay({
timestamp: paymap.timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但**新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr: paymap.nonceStr, // 支付签名随机串,不长于 32 位
package: paymap.package_, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
signType:paymap.signType, // 签名方式,默认为 SHA1 ,使用新版支付需传入 MD5
paySign: paymap.paySign, // 支付签名
success: function (res) {
// alert( 支付成功! );
// 支付成功后的回调函数
}
});
});
wx.error(function (res) {
alert(res.errMsg);
});
需要警惕地方
1、后台在进行加密的时候一定要注意大小写,加密是32位的。
2、获取统一下单Id的时候 注意body里面的内容要使用[CDATA[]]包含起来。
3、注意测试授权目录一定是**后一级。
4、微信wx.chooseWXPay({})方法里面的 timeStamp的值是秒数,后台要用毫秒数除以1000不要弄成毫秒数了。
5、代码出了bug淡定点笑着面对千万不要心急喔,加油!!!!
6、demo**地址: https://pan.baidu.com/s/1i58z33B
相关推荐:
苏州JAVA培训 苏州JAVA培训班 苏州JAVA培训机构