jsapi微信支付v3版

请看清楚你的微信支付是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;
  }
				
时间: 2024-10-25 12:21:05

jsapi微信支付v3版的相关文章

微信支付v3版-微信支付开发教程

微信支付现在分为v2版和v3版,2014年9月10号之前申请的为v2版,之后申请的为v3版.V3版的微信支付没有paySignKey参数. 微信支付v3 提示:因微信支付商户平台升级,若您在资料审核通过后,收到支付小助手发送的邮件通知为以下信息,请按本页面接口文档进行支付开发.1. 信息包括:商户ID.申请编号.登录帐号.登录密码.商户API密码2..证书包括:商户API证书.证书密钥.CA证书 1. 使用网页授权接口 使用网页授权接口获取用户的基本信息. [微信公众号]OAuth2.0授权.p

新版本 JSAPI微信支付V3 C# DEMO

小弟在公众号后台无意中点了更新(微信支付接口升级)PS:想都没有想,心里还乐滋滋的免费的干嘛不升级...后果来了.面临着支付不能用了,代码需要重新更新. /** * JS_API支付demo * ==================================================== * 在微信浏览器里面打开H5网页中执行JS调起支付.接口输入输出数据格式为JSON. * 成功调起支付需要三个步骤: * 步骤1:网页授权获取用户openid (难点,因为这里有个大坑) * 步骤2

微信支付--v3版

主要记录在这里以防后面忘记.... 1.前面网上一大堆,不说直接上前端方面代码.. var wx; wx.config({ debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印. appId: appId, // 必填,公众号的唯一标识 timestamp: timestamp4, // 必填,生成签名的时间戳 nonceStr: noncestr4, // 必填,生

到处都是坑的微信支付V3

业务需要一个在微信上能付款的功能,于是乎想到了最普遍的支付宝,坑爹的是T与A是水火不容啊,默默的还是接微信支付吧,没想到从此掉进了连环坑…… 网上写微信支付接口的还是很多,PHP官方有(鄙视源码作者,连参数对应都错了,能跑通才怪),NET版 微信支付--入门篇 这篇算是比较全的,java版. PHP的只能参考,终究还是先按NET版的还创建项目,不过文章里面也没具体写到如何前后台交互(偶用的MVC),对于初次接触的人来说只能问题来一个解决一个. 至于怎么从0开发就不用详细说明了,参考这位仁兄的 微

微信支付v3开发(5) 扫码并输入金额支付

关键字:微信支付 微信支付v3 动态native支付 统一支付 Native支付 prepay_id 作者:方倍工作室 本文介绍微信支付下的扫描二维码并输入自定义金额的支付的开发过程. 注意 微信支付现在分为v2版和v3版,2014年9月10号之前申请的为v2版,之后申请的为v3版.V3版的微信支付没有paySignKey参数.v2的相关介绍请参考方倍工作室的其他文章.本文介绍的为微信支付v3. 一. OAuth2.0授权 JSAPI 支付前需要调用 登录授权接口获取到用户的 Openid .所

微信支付V3集成过程(Native)

长话短说,微信支付V3版本相比V2版本,简化许多接口,大大降低了商户的接入代价,只不过由于相关的集成说明文档写的过于笼统,细节描述不够具体,demo版本不够完善等等原因,被大家诟病. 最近基于业务需要,完成了微信支付的接入,选择的是公众号扫码支付(Native模式).在此把集成的大致过程贴出来,希望能对正在困扰的各位有所帮助. 整个交互过程分为四步: 1.商户:生成微信支付二维码 2.微信:扫描二维码,获取商户订单信息 3.微信:确认支付,调起微信支付模块,完成支付,回调商户通知接口 4.商户:

坑爹的微信支付v3,其实没有那么坑

研究微信开发一年多了,每个新接口,都会第一时间进行研究.微信支付开放很久,一直没机会接触到支付接口,等了好久终于从朋友那儿搞到了接口,从此开始了我两天多的支付接口的研究. 拿到这个接口文档的第一个想法就是这也没什么难的嘛, 和支付宝.财付通.网银在线等一些传统接口的思路逻辑都是一样的,觉得差不多最多一个下午就可以搞定,结果第一步调用统一支付接口就给来了个下马威,不管怎么改,就一直返回签名错误.第一次遇到签名错误,首先想到的是应该是没有正确理解签名的生成规则,又从头看了几次签名的生成规则,每次都是

到处都是坑的微信支付V3之 微信支付回调页面

据上次 到处都是坑的微信支付V3 后很多园友在被虐了千百遍后终于跳转到了亲切的微信支付界面,但输入密码支付后却不知道怎么处理了,接下来补上支付后的处理流程. 1. html中根据前台支付后反馈信息成功与否跳转到相关页面 if (res.err_msg == "get_brand_wcpay_request:ok") { // message: "微信支付成功!", window.location.replace("@Url.Content("~/

微信支付[v3]

原文:微信支付[v3] V2升级V3 顺便记录一下 ,文档: http://pay.weixin.qq.com/wiki/doc/api/index.html !!! 支付授权目录与测试人的微信帐号白名单(出现access_denied或access_not_allow错误,请检查是否设置正确) 微信签名(用于jssdk调用支付,查询订单,异步参数签名等) 数字证书,用于微信退款 参数签名 对所有传入参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL 键值对的格式(即key1=v