jsapi微信支付v3版

标签: jsapi 微信 v3 | 发表时间:2015-08-21 18:32 | 作者:mrandy
出处:http://blog.csdn.net

请看清楚你的微信支付是v2还是v3,在这里整理的是v3的,v2的同学请忽略!

前期准备需要用的是商户证书,用的是p12的,设置api密钥(在微信商户端中设置),还需要在微信公众号中设置jsapi授权目录;

1.微信授权获取用户openid

<a href="https://open.weixin.qq.com/connect/oauth2/authorize?appid=你的微信公众号appid&redirect_uri=授权完回调你的url&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect">点击测试</a>

2.授权回调接口,在接口中解析获取用户openid,如果已经授权的过的,我是通过解析获取到code然后再请求微信得到openid

https://api.weixin.qq.com/sns/oauth2/access_token?appid=你的微信公众号appid&secret="+appsecret+"&code="+code+"&grant_type=authorization_code

3.用户下单提交,分两步,第一步通过统一下单接口获取prepay_id,第二步提交微信支付

前端代码:根据获取的openid提交后端

function wxpayCommit(){
        $.ajax({
	    type : "POST",
	    url : "/wxpayCommit",
	    data :"openid=${openid}",
	    dataType : "json",
	    async : false,
	    success : function(obj) {
					
	    if(obj.prepay_id ==""){
		  return;
	    }

	    WeixinJSBridge.invoke('getBrandWCPayRequest',{  
		  "appId" : obj.appid,                    
		  "timeStamp":obj.timeStamp,           
		  "nonceStr" : obj.nonceStr,           
		  "package" : "prepay_id="+obj.prepay_id,        
		  "signType" : "MD5",        
		  "paySign" : obj.paySign 
	    },function(res){      
		   alert(res.err_msg);  
	           if(res.err_msg == "get_brand_wcpay_request:ok" ) {  
		        window.location.href="/index";  
		   }else{  
		        alert("fail");  
		        window.location.href="/wxpayCommit";     
		                                      
		   }  
	    });  
	},
	error : function(msg) {
                    alert("fail");  

	}
	});


 

 

//统一下单接口获取prepay_id

注意中间遇到签名错误,是你的sign有问题,最好办法在微信官网在线生成签名的比对一样,马上找到错误

SortedMap<String, String> packageParams = new TreeMap<String, String>();
packageParams.put("appid", TenpayConfig.appid);
packageParams.put("mch_id", TenpayConfig.partner);
packageParams.put("nonce_str", WXUtil.getNonceStr());
packageParams.put("body", "测试");
packageParams.put("out_trade_no", 你的唯一订单号);
packageParams.put("total_fee","1"); 	  //银行币种
packageParams.put("spbill_create_ip",  request.remoteAddress); //订单生成的机器IP,指用户浏览器端IP
packageParams.put("notify_url", 回调的url);
packageParams.put("openid", openid); 
packageParams.put("trade_type", "JSAPI"); 
			
RequestHandler reqHandler = new RequestHandler(null, null);
reqHandler.init(TenpayConfig.appid, TenpayConfig.appsecret, TenpayConfig.partnerkey);
String sign = reqHandler.createSign(packageParams);
packageParams.put("sign", sign);
String xml = toXml(packageParams);
String prepay_id = "";
String createOrderURL = "https://api.mch.weixin.qq.com/pay/unifiedorder";

//获取用户的
prepay_id = new GetWxOrderno().getPayNo2(createOrderURL, xml);
//生成paysign
SortedMap<String, String> payParams = new TreeMap<String, String>();
String non = WXUtil.getNonceStr();
String time = WXUtil.getTimeStamp();
payParams.put("appId", TenpayConfig.appid);
payParams.put("nonceStr", non);
payParams.put("timeStamp", time);
payParams.put("package", "prepay_id="+prepay_id);
payParams.put("signType", "MD5");
String paysign = reqHandler.createSign(payParams);

附上其他代码

public static String getNonceStr() {
Random random = new Random();
return MD5Util.MD5Encode(String.valueOf(random.nextInt(10000)),"GBK");
}
public static String getTimeStamp() {
return String.valueOf(System.currentTimeMillis() / 1000);
}
public static String getMchBillno(Stringmchid) {
SimpleDateFormat shortSdf =new SimpleDateFormat("yyyyMMdd");
String result = mchid+shortSdf.format(new Date())+String.valueOf(System.currentTimeMillis() / 1000);
returnresult;
}
public String createSign(SortedMap<String, String>packageParams) {
StringBuffer sb =new StringBuffer();
Set es = packageParams.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
String v = (String)entry.getValue();
if (null !=v && !"".equals(v) && !"sign".equals(k)
&& !"key".equals(k)) {
sb.append(k +"=" +v +"&");
}
}
sb.append("key=" +this.getKey());//api密钥
String sign = MD5Util.MD5Encode(sb.toString(),this.charset)
.toUpperCase();
returnsign;
}

 private static String toXml(SortedMap<String, String>params)
{
StringBuilder sb = new StringBuilder();
sb.append("<xml>");

for (Map.Entry<String, String>e :params.entrySet())
{
sb.append("<" +e.getKey() +">");
sb.append(e.getValue());
sb.append("</" +e.getKey() +">");
}
sb.append("</xml>");
returnsb.toString();
}
public static String getPayNo2(Stringurl,StringxmlParam)throws Exception{
  KeyStore keyStore  = KeyStore.getInstance("PKCS12");
  String prepay_id = "";
      FileInputStream instream = new FileInputStream(new File("p12的证书路径"));
      try {
          keyStore.load(instream, TenpayConfig.partner.toCharArray());
      } finally {
          instream.close();
      }
      // Trust own CA and all self-signed certs
      SSLContext sslcontext = SSLContexts.custom()
              .loadKeyMaterial(keyStore, TenpayConfig.partner.toCharArray())
              .build();
      // Allow TLSv1 protocol only
      SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
              sslcontext,
              new String[] { "TLSv1" },
              null,
              SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
      CloseableHttpClient httpclient = HttpClients.custom()
              .setSSLSocketFactory(sslsf)
              .build();
      try {
      HttpPost httpost= HttpClientConnectionManager.getPostMethod(url);
  httpost.setEntity(new StringEntity(xmlParam,"UTF-8"));
      HttpResponse response = httpclient.execute(httpost);
        String jsonStr = EntityUtils.toString(response.getEntity(),"UTF-8");
        if(jsonStr.indexOf("FAIL")!=-1){
      return "2";
        }
        Map map = doXMLParse(jsonStr);
        prepay_id  = (String) map.get("prepay_id");
      } finally {
          httpclient.close();
      }
returnprepay_id;
  }


 
作者:mrandy 发表于2015/8/21 10:32:33 原文链接
阅读:73 评论:0 查看评论

相关 [jsapi 微信 v3] 推荐:

jsapi微信支付v3版

- - CSDN博客综合推荐文章
请看清楚你的微信支付是v2还是v3,在这里整理的是v3的,v2的同学请忽略. 前期准备需要用的是商户证书,用的是p12的,设置api密钥(在微信商户端中设置),还需要在微信公众号中设置jsapi授权目录;. 1.微信授权获取用户openid. 点击测试.

高德地图jsapi调用 - 灵之海

- - 博客园_首页
今天公司项目要做一个基于地图的位置展示,在网上找了下,发现高德地图开放api能满足功能,现对其应用做一下简单的记录. 1.首先在高德开发平台上注册,简单填写相关信息后,可以获得key,拿到key后可以调用高德地图api的相关接口. 2.在调用api的相关页面引入高德api,eg:. 3.根据初始位置创建地图实例,eg:.

中国移动 - 飞聊Android、Symbian V3/V5版上线

- Linker Lin - cnBeta全文版
飞聊Android_1.0.1beta版.S60V3_1.0.1beta版.S60V5_1.0.1beta版抢先体验,功能如下:. 1、整合飞信好友关系:使用飞信帐号体系登录,给飞信好友免费发消息;. 2、跨网互通:使用飞聊实现移动联通用户互动互通;. 3、沟通能力:免费消息、图片、语音对讲、离线消息通知;.

chrome 插件开发指南(Manifest V3) - 掘金

- -
严格来讲,我们正在说的东西应该叫 Chrome 扩展(Chrome Extension),真正意义上的 Chrome 插件是更底层的浏览器功能扩展,需要对浏览器源码有一定掌握才有能力去开发. 鉴于 Chrome 插件的叫法已经习惯,本文中也全部采用这种叫法. 在百度指数里也没有收录“chrome 扩展”这个词,只有“chrome 插件”.

微信的价值

- - 钛媒体TMTpost—把脉科技资本论
昨天,微信正式发布了4.5版. 在我看来,这个新版本释放出了两个关键的信号,第一个是微信只做底层的平台,具体的应用会开放给第三方来做,第二个是微信公众账号未来的形态,一定不是简单的对话,而是类似app的形态. 首先,我们看到微信把保存公众账号文章这个功能,开放给了“我的印象笔记”. 这是一个非常基础性的功能,微信完全可以自己来做,而且自己做从客户体验角度来讲,也会最方便,但是它把它开放了.

微信是什么?

- - 《商业价值》杂志
一个移动互联网时代全民都在参与回答的问题. 2012年12月,丁香园CTO、知名互联网评论人冯大辉在推出不久的微信公众平台上创建并运营自己的公众号一段时间之后,说了一句让人印象深刻的话,“对话即服务,对话即搜索”. “微信一定会蚕食搜索引擎的市场……搜索本质上也是服务,天气、旅游、购物、股票……皆可拓展.

微信是鸡肋?

- - 月光博客
   微信是一款跨平台的通讯工具,作为腾讯最为倚重和寄予厚望的产品,承载着腾讯移动互联网称霸之梦. 本文希望透过微信,加深对社会化媒体与移动互联网的理解,概述微信在社会化媒体及移动互联网的角色定位.   我们可以用微信与好友一对一聊天,具有私密性强,快捷便利的特点,这是微信的一个基本功能. 陌陌,微博私信,QQ等都可以具有这样的功能,显然这形成不了微信的核心竞争力.

微信在东南亚推“WeChat GO 微信乐游卡”,聊微信免流量

- - PingWest品玩
PingWest 品玩 9 月 8 日报道,微信与新加坡第二大电信运营商 StarHub(星和电信)合作,推出一款名为“WeChat GO 微信乐游卡”的电话卡产品. “微信乐游卡”用户在境内可以免流量使用微信,同时提供 7 天和 12 天两种套餐,定价分别为 16 新元和 32 新元. 前者提供 7GB 定额流量和 1GB 高速可漫游流量,500 分钟本地通话时长以及 60 分钟直拨主叫中国大陆通话时长;12 天套餐提供 15GB 定额流量,2.4GB 高速可漫游流量,3000 分钟本地通话时长和 150 分钟主叫中国大陆通话时长.

微信架构的启示

- - Tim[后端技术]
腾讯大讲堂中最近分享了周颢演讲的 微信技术总监解读微信架构的秘密,看完视频的一些心得. 微信的技术设计上有很多微创新,看起来都很小,但是对于系统的稳定性、用户体验及开发敏捷都具有重要作用. 由于客户端升级不便,从技术设计上尽量利用后端的设计来减少依赖客户端升级的方法. 如某个版本新增了群聊功能,按常规思路,需要所有客户端升级才能全部打通.