微信网页支付应该怎么网页调用微信登录接口接口

最近准备上网页的支付,大家可以参考后续教程:
因微信支付已经升级到V3版本,请大家参考官网的帮助文档。
之前一篇提到微信支付的开发过程,写得有点乱,现在重新整理一下。
好了,说说到底该怎样一步一步分享处理。
解压从官网下载下来的开发说明文档(下载地址:):
先把服务端demo的代码整理到我们的服务端中(注意,此代码的编码格式是GBK,直接复制过去注释都会变乱码。可用文本文件打开后再复制过去)。处理完成后启动;且访问:http://localhost:8080/WeiXinpay/
会得到以下视图:
-------------------------------------------------------------------------------------------------------------
页面跳转调用:
后台调用:
点击链接:
0OK&wxd930ea5d5a258f4f&454ceccd624cd8a8c9ddf1&Sign=WXPay&&1c0c02c882&eb139e44b8df8ce01b386f7c016defe5b04896
-------------------------------------------------------------------------------------------------------------
返回控制台可以得到以下视图:
好了,到这里,算是成功了一小步了(哈哈哈哈哈哈 yy一下)。
你也许会问,这些参数到底是作什么用的?更可悲的是,居然没有服务端的接口文档。
唯有先看手头上有的资料了。打开《【微信APP支付】接口文档V1.2_For_Android.pdf》
里面有提到微信支付的调用步骤:
1、获取& access_token
2、生成预支付订单
3、调起微信支付
下面说说这几个步骤:
1、access_token的获取
因为access_token的获取有请求频的限制,只能固化到中了。这个不是难题。
2、生成预支付订单
在微信支付的接口文档开头有提到:
注意:appsecret、appkey、partnerkey 不应硬编码到客户端程序中,建议需要用到这三个字段的过程都在服务器端完成
故此过程所有的信息全部在服务端生成。那么问题来了?挖掘机.... kao, 应该是,如何生成?
在翻看服务端的demo中,有jsp文件夹。打开一看,都几乎可以直接搬运使用了。
实现该过程的文件:payRequest.jsp
如何在中实现上面jsp的请求?项目中用到了
MVC,代码如下:
@Controller&&@RequestMapping(&/weixin/&)&&public&class&WeiXinPayController&extends&ResponsePage&&{&&&&&&&&private&Logger&log&=&Logger.getLogger(WeiXinPayController.class);&&&&&&&&&&&&@RequestMapping(&weixin.do&)&&&&&&public&String&doWeinXinRequest(HttpServletRequest&request,HttpServletResponse&response)&throws&Exception&{&&&&&&&&&&Map&Object,Object&&resInfo&=&new&HashMap&Object,&Object&();&&&&&&&&&&&&&&&&&&&&String&notify_url&=&&http://127.0.0.1:8180/tenpay_api_b2c/payNotifyUrl.jsp&;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&String&currTime&=&TenpayUtil.getCurrTime();&&&&&&&&&&&&&&&&&&&&String&strTime&=&currTime.substring(8,&currTime.length());&&&&&&&&&&&&&&&&&&&&String&strRandom&=&TenpayUtil.buildRandom(4)&+&&&;&&&&&&&&&&&&&&&&&&&&String&strReq&=&strTime&+&strR&&&&&&&&&&&&&&&&&&&&String&out_trade_no&=&strR&&&&&&&&&&&&&&&&&&&&&&PackageRequestHandler&packageReqHandler&=&new&PackageRequestHandler(request,&response);&&&&&&&&&&PrepayIdRequestHandler&prepayReqHandler&=&new&PrepayIdRequestHandler(request,&response);&&&&&&&&&&ClientRequestHandler&clientHandler&=&new&ClientRequestHandler(request,&response);&&&&&&&&&&packageReqHandler.setKey(ConstantUtil.PARTNER_KEY);&&&&&&&&&&&&int&retcode&;&&&&&&&&&&String&retmsg&=&&&;&&&&&&&&&&String&xml_body&=&&&;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&String&token&=&AccessTokenRequestHandler.getAccessToken();&&&&&&&&&&&&&&&&&&&&(&获取token------值&&&+&token);&&&&&&&&&&&&&&&&&&&&if&(!&&.equals(token))&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&packageReqHandler.setParameter(&bank_type&,&&WX&);&&&&&&&&&&&&&&packageReqHandler.setParameter(&body&,&&测试&);&&&&&&&&&&&&&&&packageReqHandler.setParameter(&notify_url&,&notify_url);&&&&&&&&&&&&&&&packageReqHandler.setParameter(&partner&,&ConstantUtil.PARTNER);&&&&&&&&&&&&&&&packageReqHandler.setParameter(&out_trade_no&,&out_trade_no);&&&&&&&&&&&&&&&packageReqHandler.setParameter(&total_fee&,&&1&);&&&&&&&&&&&&&&&packageReqHandler.setParameter(&spbill_create_ip&,request.getRemoteAddr());&&&&&&&&&&&&&&&packageReqHandler.setParameter(&fee_type&,&&1&);&&&&&&&&&&&&&&&packageReqHandler.setParameter(&input_charset&,&&GBK&);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&String&packageValue&=&packageReqHandler.getRequestURL();&&&&&&&&&&&&&&resInfo.put(&package&,&packageValue);&&&&&&&&&&&&&&&&&&&&&&&&&&&&(&获取package------值&&&+&packageValue);&&&&&&&&&&&&&&&&String&noncestr&=&WXUtil.getNonceStr();&&&&&&&&&&&&&&String&timestamp&=&WXUtil.getTimeStamp();&&&&&&&&&&&&&&String&traceid&=&&&;&&&&&&&&&&&&&&&&&&&&&&&&&&&&prepayReqHandler.setParameter(&appid&,&ConstantUtil.APP_ID);&&&&&&&&&&&&&&prepayReqHandler.setParameter(&appkey&,&ConstantUtil.APP_KEY);&&&&&&&&&&&&&&prepayReqHandler.setParameter(&noncestr&,&noncestr);&&&&&&&&&&&&&&prepayReqHandler.setParameter(&package&,&packageValue);&&&&&&&&&&&&&&prepayReqHandler.setParameter(&timestamp&,&timestamp);&&&&&&&&&&&&&&prepayReqHandler.setParameter(&traceid&,&traceid);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&String&sign&=&prepayReqHandler.createSHA1Sign();&&&&&&&&&&&&&&&&&&&&&&&&&&&&prepayReqHandler.setParameter(&app_signature&,&sign);&&&&&&&&&&&&&&prepayReqHandler.setParameter(&sign_method&,&&&&&&&&&&&&&&&&&&&&&&ConstantUtil.SIGN_METHOD);&&&&&&&&&&&&&&String&gateUrl&=&ConstantUtil.GATEURL&+&&&&&&&&&&&&&&&prepayReqHandler.setGateUrl(gateUrl);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&String&prepayid&=&prepayReqHandler.sendPrepay();&&&&&&&&&&&&&&&&&&&&&&&&&&&&(&获取prepayid------值&&&+&prepayid);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(null&!=&prepayid&&&&!&&.equals(prepayid))&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&clientHandler.setParameter(&appid&,&ConstantUtil.APP_ID);&&&&&&&&&&&&&&&&&&clientHandler.setParameter(&appkey&,&ConstantUtil.APP_KEY);&&&&&&&&&&&&&&&&&&clientHandler.setParameter(&noncestr&,&noncestr);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&clientHandler.setParameter(&package&,&&Sign=WXPay&);&&&&&&&&&&&&&&&&&&clientHandler.setParameter(&partnerid&,&ConstantUtil.PARTNER);&&&&&&&&&&&&&&&&&&clientHandler.setParameter(&prepayid&,&prepayid);&&&&&&&&&&&&&&&&&&clientHandler.setParameter(&timestamp&,&timestamp);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&sign&=&clientHandler.createSHA1Sign();&&&&&&&&&&&&&&&&&&clientHandler.setParameter(&sign&,&sign);&&&&&&&&&&&&&&&&&&&&xml_body&=&clientHandler.getXmlBody();&&&&&&&&&&&&&&&&&&resInfo.put(&entity&,&xml_body);&&&&&&&&&&&&&&&&&&retcode&=&0;&&&&&&&&&&&&&&&&&&retmsg&=&&OK&;&&&&&&&&&&&&&&}&else&{&&&&&&&&&&&&&&&&&&retcode&=&-2;&&&&&&&&&&&&&&&&&&retmsg&=&&错误:获取prepayId失败&;&&&&&&&&&&&&&&}&&&&&&&&&&}&else&{&&&&&&&&&&&&&&retcode&=&-1;&&&&&&&&&&&&&&retmsg&=&&错误:获取不到Token&;&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&resInfo.put(&retcode&,&retcode);&&&&&&&&&&resInfo.put(&retmsg&,&retmsg);&&&&&&&&&&String&strJson&=&JSON.toJSONString(resInfo);&&&&&&&&&&return&responseAjax(request,&strJson);&&&&&&}&&&&&&&&}&&
好了此时,客户端需要的参数都已经可以通过请求:http://localhost:8080/WeiXinpay/weixin/weixin.do 来获取
3、调起微信支付
这步就不需要我们服务端处理了。客户端的兄弟,来接力。
示例的完整代码可以在此链接下载:
最后,微信回调:可以参考jsp文件夹中的payNotifyUrl.jsp来处理,处理过程和上面第二步差不多。
本文已收录于以下专栏:
相关文章推荐
SSM =SpringMVC +Spring +Mybatis
需要的jar包链接链接:/s/1c10kx7U 密码:1u18
我们先来看看文件结构图
看着平时常用的网站慢慢实现成功,越来越感觉没有什么做不到,只是我们没有想去实现而已。虽然我只是个实现者,还是积累一下吧。
           框架是SSH(Spring、Struts、Hi...
接上篇;上篇我们提到需要通过访问一个链接来获取微信用户的openid。接下来,我们看看需要准备哪些工具:
1)、微信测试公众号
2)、内网穿透工具
3)、开发工具
1、微信测试公众号,我们可以用自己的...
很多童鞋在被虐了千百遍后终于跳转到了亲切的微信支付界面,但输入密码支付后却不知道怎么处理了,接下来补上支付后的处理流程。1. html中根据前台支付后反馈信息成功与否跳转到相关页面
if (res....
最近接触了不少的项目,从SSM到SSH都接触到了,然而对于这几个项目的架构还是一知半解,我自己花费了一些时间,整理下,写了一个SSM的框架的demo,后期我会给出SSH的一个demo,以及不断加入新的...
最近要做网页微信公众号网页调微信支付。好了,废话不多说,先看官方的文档:
https://pay./index.php/home/login?return_url=%2F ...
最近准备上网页的微信支付,大家可以参考后续教程:http://blog.csdn.net/seven_cm/article/details/-09-12 更新:因微信支付已经升...
基于微信支付文档V3.3.7进行编码,使用JS API(网页内)并测试通过,应用在项目中。
[java] view
plain copy
public class...
我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能;而且在大部分教学课堂中,也会把SSH作为最核心的教学内容。 
但是,我们在实际应用中发现,SpringMVC...
JavaWEB后端支付银联,支付宝,微信对接标签(空格分隔): java项目概述最近项目需要后端打通支付,所以对接部分做成了一个小模块.
先说下项目要求:
后端要对接银联无跳转Token支付,支付...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)微信公众号已经有很多商家在使用,当然,这里肯定会涉及到微商城,在微信内部系统发生的交易都是采用微支付的付款模式。
  当然商家微信支付,和淘宝的支付宝一样是需要收取第三方支付费用的,费率最低为0.6%最高为2%,收费的具体费率情况与交易的产品类型有关系。具体您可以看下面的费率图片。另外申请微信支付还有什么要求?第一你需要根据不同行业缴纳不同的保证金,保证金最低为5万。
  还需什么条件?需要相关行业的相关证件。另外需要您的公众号服务号,并且认证通过。
  微信商家微信支付费率具体详情
  支付费率最低0.6% 保证金5万
  根据获得的《微信支付类目及费率对照表》,对接入微信支付的商户,微信将收取5万保证金以及0.6%~2%不等的支付手续费费率。微信将给商户开设专属的财付通账号,交商户自己管理,商户自己将保证金放进财付通账号,由微信/财付通冻结。
  而在账期方面,微信采取的是T+3结算周期。与支付宝不同,微信支付是即时到账模式,非担保交易,买家付款后,资金直接进入卖家财付通账户,3天后可结算、提现。
  据了解, 5万的保证金与其它电商平台相比并不算高,天猫商户入驻的保证金大致分为5万、10万、15万3档,而京东的商户入驻保证金分为1万、3万、5万、10万等几档。
  支付费率方面,根据公开资料显示,传统POS机刷卡的手机费率通常在1%~3%之间,而支付宝的支付费率通常在0.7%~1.2%之间。ThinkPHP微信支付接口开发完整例子分享 - ThinkPHP框架
ThinkPHP交流QQ群 :
微信支付接口开发很简单我们只需要在官方申请权限然后参考官方的文章即可实现支付开发了,下面来看一个简单的例子,具体如下。
最近有个微商城做了微信支付的接口,现在整理一下发上来。
首先是需要有已开通微信支付接口的公众号,这个相信大家都知道,开通之后微信会发一封邮件到你的邮箱,邮件的内容就是开发需要用到的一些接口信息了(包含账号密码之类的东西)。
1、在设置 -& 公众号设置 -& 功能设置 -& 设置JS接口安全域名
2、在微信支付 -& 开发配置 -& 配置你的js支付接口,回调地址等等,正式目录和测试目录都可以写上,测试目录需要把个人微信号先添加到白名单才能使用(提醒:用TP框架的小伙伴们在填写支付授权目录时可以这样填写:域名/index.php/控制器/,经测试是可以通过的,微信一样能检测到,之前看到网上有人说这样不行,可能是现在升级了吧,呵呵,还有一个就是域名一定要是已经备过案的才行,如果是在本地进行测试的小伙伴们可以使用花生壳,我不是在打广告,个人觉得还是挺好用的)
3、在开发者中心把“网页授权获取用户基本信息”的域名写上自己的域名,微信登陆时需要用到的;
二、到上面一大步设置完成后就可以开始我们的开发工作了;
1、新建Wxpay控制器,当然你也可以自己命名,访问的名称要跟你在微信上配置的授权目录一样就好了;点击这里下载Wxpay
2、代码的地方就不多说了,下面直接上代码;
四、以上就是微信支付的整个流程了,扫码支付的应该都差不多,我没去弄了,用过的朋友也可以分享下,^_^;来上几张支付的截图
漩涡小蚂蚁
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。微信公众号支付H5调用支付解析_javascript技巧
作者:用户
本文讲的是微信公众号支付H5调用支付解析_javascript技巧,
最近项目需要微信支付,然后看了下微信公众号支付,虽然不难,但是细节还是需要注意的,用了大半天时间写了个demo,并且完整的测试了一下支付流程,下面分享一下微信公众号支付的经验。
一、配置公众号微信支付
需要我们配置微信公众号支付地址和
最近项目需要微信支付,然后看了下微信公众号支付,虽然不难,但是细节还是需要注意的,用了大半天时间写了个demo,并且完整的测试了一下支付流程,下面分享一下微信公众号支付的经验。
一、配置公众号微信支付
需要我们配置微信公众号支付地址和测试白名单。
比如:支付JS页面的地址为 /shop/pay/
那此处配置/shop/pay/
借用微信公众号支付api(地址 http://pay./wiki/doc/api/index.php?chapter=7_4),我们需要开发的为红色标记出的。如下:
三、向微信服务器端下订单
调用统一下单接口,这样就能获取微信支付的prepay_id(http://pay./wiki/doc/api/index.php?chapter=9_1)。
在调用该接口前有几个字段是H5支付必须填写的openid
3.1 获取openid
可以通过网页授权形式(http://mp./wiki/17/c0f37d13d5d2c37b468d75.html)
在微信中发送如下链接
https://open./connect/oauth2/authorize?appid=wx520c15f&redirect_uri=要跳转的下订单的url&response_type=code&scope=snsapi_base&state=123#wechat_redirect
3.2 后台支付
代码如下,包含预处理订单,支付订单等接口。
package org.andy.
import java.io.ByteArrayInputS
import java.io.IOE
import java.io.InputS
import java.io.UnsupportedEncodingE
import java.util.D
import java.util.HashM
import java.util.I
import java.util.M
import java.util.Map.E
import java.util.R
import javax.servlet.ServletInputS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import mons.codec.digest.DigestU
import org.springframework.stereotype.C
import org.springframework.web.bind.annotation.RequestM
import org.xmlpull.v1.XmlPullP
import org.xmlpull.v1.XmlPullParserE
import org.xmlpull.v1.XmlPullParserF
import com.fasterxml.jackson.databind.JsonN
import com.gson.oauth.O
import com.gson.oauth.P
import com.gson.util.HttpK
import com.gson.util.T
import org.andy.util.DatetimeU
import org.andy.util.JsonU
import org.andy.util.SessionU
import org.andy.util.WebU
@Controller
@RequestMapping("/pay")
public class WXPayController {
@RequestMapping(value = "wxprepay")
public void jspay(HttpServletRequest request, HttpServletResponse response, String callback) throws Exception {
// 获取openid
String openId = SessionUtil.getAtt(request, "openId");
if (openId == null) {
openId = getUserOpenId(request);
String appid = "wx16691fcb";
String partnerid = "";
String paternerKey = "fjfjfjfjf1234567FFFFFFFFF1234567";
String out_trade_no = getTradeNo();
Map&String, String& paraMap = new HashMap&String, String&();
paraMap.put("appid", appid);
paraMap.put("attach", "测试支付");
paraMap.put("body", "测试购买Beacon支付");
paraMap.put("mch_id", partnerid);
paraMap.put("nonce_str", create_nonce_str());
paraMap.put("openid", openId);
paraMap.put("out_trade_no", out_trade_no);
paraMap.put("spbill_create_ip", getAddrIp(request));
paraMap.put("total_fee", "1");
paraMap.put("trade_type", "JSAPI");
paraMap.put("notify_url", "http://www.xxx.co/wxpay/pay/appPay_notify.shtml");
String sign = getSign(paraMap, paternerKey);
paraMap.put("sign", sign);
// 统一下单 https://api.mch./pay/unifiedorder
String url = "https://api.mch./pay/unifiedorder";
String xml = ArrayToXml(paraMap, false);
String xmlStr = HttpKit.post(url, xml);
// 预付商品id
String prepay_id = "";
if (xmlStr.indexOf("SUCCESS") != -1) {
Map&String, String& map = doXMLParse(xmlStr);
prepay_id = (String) map.get("prepay_id");
Map&String, String& payMap = new HashMap&String, String&();
payMap.put("appId", appid);
payMap.put("timeStamp", create_timestamp());
payMap.put("nonceStr", create_nonce_str());
payMap.put("signType", "MD5");
payMap.put("package", "prepay_id=" + prepay_id);
String paySign = getSign(payMap, paternerKey);
payMap.put("pg", prepay_id);
payMap.put("paySign", paySign);
WebUtil.response(response, WebUtil.packJsonp(callback, JsonUtil.warpJsonNodeResponse(JsonUtil.objectToJsonNode(payMap)).toString()));
@RequestMapping(value = "appPay")
public void appPay(HttpServletRequest request, HttpServletResponse response, String body, String detail, String total_fee, String spbill_create_ip,
String notify_url, String trade_type, String callback) throws Exception {
String appid = "wx16691fcb";
String partnerid = "";
String paternerKey = "fjfjfjfjf1234567FFFFFFFFF1234567";
String out_trade_no = getTradeNo();
Map&String, String& paraMap = new HashMap&String, String&();
paraMap.put("appid", appid);
paraMap.put("body", body);
paraMap.put("mch_id", partnerid);
paraMap.put("nonce_str", create_nonce_str());
paraMap.put("out_trade_no", out_trade_no);
paraMap.put("spbill_create_ip", spbill_create_ip);
paraMap.put("total_fee", total_fee);
paraMap.put("trade_type", trade_type);
paraMap.put("notify_url", notify_url);
String sign = getSign(paraMap, paternerKey);
paraMap.put("sign", sign);
// 统一下单 https://api.mch./pay/unifiedorder
String url = "https://api.mch./pay/unifiedorder";
String xml = ArrayToXml(paraMap, false);
String xmlStr = HttpKit.post(url, xml);
// 预付商品id
String prepay_id = "";
Map&String, String& map = doXMLParse(xmlStr);
if (xmlStr.indexOf("SUCCESS") != -1) {
prepay_id = (String) map.get("prepay_id");
String result_code = map.get("result_code");
String err_code_des = map.get("err_code_des");
Map&String, String& payMap = new HashMap&String, String&();
payMap.put("appid", appid);
payMap.put("partnerid", partnerid);
payMap.put("prepayid", prepay_id);
payMap.put("package", "Sign=WXPay");
payMap.put("noncestr", create_nonce_str());
payMap.put("timestamp", create_timestamp());
String paySign = getSign(payMap, paternerKey);
payMap.put("sign", paySign);
payMap.put("result_code", result_code);
payMap.put("err_code_des", err_code_des);
WebUtil.response(response, WebUtil.packJsonp(callback, JsonUtil.warpJsonNodeResponse(JsonUtil.objectToJsonNode(payMap)).toString()));
@RequestMapping("/appPay_notify")
public void appPayNotify(HttpServletRequest request, HttpServletResponse response) throws Exception{
//String xml = "&xml&&appid&&![CDATA[wxb4dc385f953b356e]]&&/appid&&bank_type&&![CDATA[CCB_CREDIT]]&&/bank_type&&cash_fee&&![CDATA[1]]&&/cash_fee&&fee_type&&![CDATA[CNY]]&&/fee_type&&is_subscribe&&![CDATA[Y]]&&/is_subscribe&&mch_id&&![CDATA[]]&&/mch_id&&nonce_str&&![CDATA[]]&&/nonce_str&&openid&&![CDATA[o-HREuJzRr3moMvv990VdfnQ8x4k]]&&/openid&&out_trade_no&&![CDATA[1249]]&&/out_trade_no&&result_code&&![CDATA[SUCCESS]]&&/result_code&&return_code&&![CDATA[SUCCESS]]&&/return_code&&sign&&![CDATA[F2B8C388A414EDAE185CEE]]&&/sign&&time_end&&![CDATA[05]]&&/time_end&&total_fee&1&/total_fee&&trade_type&&![CDATA[JSAPI]]&&/trade_type&&transaction_id&&![CDATA[9496]]&&/transaction_id&&/xml&";
response.setCharacterEncoding("UTF-8");
response.setContentType("text/xml");
ServletInputStream in = request.getInputStream();
String xmlMsg = Tools.inputStream2String(in);
Map&String, String& map = doXMLParse(xmlMsg);
String return_code = map.get("return_code");
String return_msg = map.get("return_msg");
map = new HashMap&String, String&();
map.put("return_code", return_code);
map.put("return_msg", return_msg);
String resXml = ArrayToXml(map, true);
response.getWriter().write(resXml);
@RequestMapping("/orderquery.do")
public void orderquery(HttpServletRequest request, HttpServletResponse response, String transaction_id, String out_trade_no, String callback) throws Exception{
String url = "https://api.mch./pay/orderquery";
String appid = "wx16691fcb";
String partnerid = "";
String paternerKey = "fjfjfjfjf1234567FFFFFFFFF1234567";
Map&String, String& map = new HashMap&String, String&();
map.put("appid", appid);
map.put("mch_id", partnerid);
if(transaction_id != null && !transaction_id.equals("")){
map.put("transaction_id", transaction_id);
map.put("out_trade_no", out_trade_no);
map.put("nonce_str", create_nonce_str());
String paySign = getSign(map, paternerKey);
map.put("sign", paySign);
String xml = ArrayToXml(map, false);
String xmlStr = HttpKit.post(url, xml);
Map&String, String& orderMap = doXMLParse(xmlStr);
WebUtil.response(response, WebUtil.packJsonp(callback, JsonUtil.warpJsonNodeResponse(JsonUtil.objectToJsonNode(orderMap)).toString()));
* map转成xml
* @param arr
public String ArrayToXml(Map&String, String& parm, boolean isAddCDATA) {
StringBuffer strbuff = new StringBuffer(&xml&);
if (parm != null ) {
for (Entry&String, String& entry : parm.entrySet()) {
strbuff.append("&").append(entry.getKey()).append("&");
if (isAddCDATA) {
strbuff.append(&![CDATA[).append(entry.getValue()).append(]]&);
strbuff.append(entry.getValue());
strbuff.append("&").append(entry.getKey()).append("&");
return strbuff.append(&/xml&).toString();
// 获取openId
private String getUserOpenId(HttpServletRequest request) throws Exception {
String code = request.getParameter("code");
if (code == null) {
String openId = request.getParameter("openId");
return openId;
Oauth o = new Oauth();
String token = o.getToken(code);
JsonNode node = JsonUtil.StringToJsonNode(token);
String openId = node.get("openid").asText();
return openId;
private String create_nonce_str() {
String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
String res = "";
for (int i = 0; i & 16; i++) {
Random rd = new Random();
res += chars.charAt(rd.nextInt(chars.length() - 1));
private String getAddrIp(HttpServletRequest request){
return request.getRemoteAddr();
private String create_timestamp() {
return Long.toString(System.currentTimeMillis() / 1000);
private String getTradeNo(){
String timestamp = DatetimeUtil.formatDate(new Date(), DatetimeUtil.DATETIME_PATTERN);
return "HZNO" +
private String getSign(Map&String, String& params, String paternerKey )
throws UnsupportedEncodingException {
String string1 = Pay.createSign(params, false);
String stringSignTemp = string1 + "&key=" + paternerK
String signValue = DigestUtils.md5Hex(stringSignTemp).toUpperCase();
return signV
private Map&String, String& doXMLParse(String xml)
throws XmlPullParserException, IOException {
InputStream inputStream = new ByteArrayInputStream(xml.getBytes());
Map&String, String& map =
XmlPullParser pullParser = XmlPullParserFactory.newInstance()
.newPullParser();
pullParser.setInput(inputStream, "UTF-8"); // 为xml设置要解析的xml数据
int eventType = pullParser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
map = new HashMap&String, String&();
case XmlPullParser.START_TAG:
String key = pullParser.getName();
if (key.equals("xml"))
String value = pullParser.nextText();
map.put(key, value);
case XmlPullParser.END_TAG:
eventType = pullParser.next();
wxprepay.shtm接口是预处理订单接口向微信服务器下订单。
appPay.shtml接口是支付接口。
appPay_notify.shtml接口是微信支付后异步通知结果接口。
orderquery.shtml接口是订单查询接口
3.3、涉及到的工具类SessionUtil.java工具类
package org.andy.
import javax.servlet.http.HttpServletR
public class SessionUtil {
public static void addAtt(HttpServletRequest request, String key, Object value){
request.getSession().setAttribute(key, value);
public static void removeAtt(HttpServletRequest request, String key){
request.getSession().removeAttribute(key);
public static String getAtt(HttpServletRequest request, String key){
return (String)request.getSession().getAttribute(key);
public static Object getAttObj(HttpServletRequest request, String key){
return request.getSession().getAttribute(key);
public static String optAtt(HttpServletRequest request, String key, String value){
String r = (String)request.getSession().getAttribute(key);
if (r == null){
HttpKit 网络请求工具类
* https 请求 微信为https的请求
* @author andy
下午2:40:19
public class HttpKit {
private static final String DEFAULT_CHARSET = "UTF-8";
* @return 返回类型:
* @throws IOException
* @throws UnsupportedEncodingException
* @throws NoSuchProviderException
* @throws NoSuchAlgorithmException
* @throws KeyManagementException
* @description 功能描述: get 请求
public static String get(String url, Map&String, String& params, Map&String, String& headers) throws IOException, ExecutionException, InterruptedException {
AsyncHttpClient http = new AsyncHttpClient();
AsyncHttpClient.BoundRequestBuilder builder = http.prepareGet(url);
builder.setBodyEncoding(DEFAULT_CHARSET);
if (params != null && !params.isEmpty()) {
Set&String& keys = params.keySet();
for (String key : keys) {
builder.addQueryParameter(key, params.get(key));
if (headers != null && !headers.isEmpty()) {
Set&String& keys = headers.keySet();
for (String key : keys) {
builder.addHeader(key, params.get(key));
Future&Response& f = builder.execute();
String body = f.get().getResponseBody(DEFAULT_CHARSET);
http.close();
* @return 返回类型:
* @throws IOException
* @throws UnsupportedEncodingException
* @throws NoSuchProviderException
* @throws NoSuchAlgorithmException
* @throws KeyManagementException
* @description 功能描述: get 请求
public static String get(String url) throws KeyManagementException, NoSuchAlgorithmException, NoSuchProviderException, UnsupportedEncodingException, IOException, ExecutionException, InterruptedException {
return get(url, null);
* @return 返回类型:
* @throws IOException
* @throws NoSuchProviderException
* @throws NoSuchAlgorithmException
* @throws KeyManagementException
* @throws UnsupportedEncodingException
* @description 功能描述: get 请求
public static String get(String url, Map&String, String& params) throws KeyManagementException, NoSuchAlgorithmException, NoSuchProviderException, UnsupportedEncodingException, IOException, ExecutionException, InterruptedException {
return get(url, params, null);
* @return 返回类型:
* @throws IOException
* @throws NoSuchProviderException
* @throws NoSuchAlgorithmException
* @throws KeyManagementException
* @description 功能描述: POST 请求
public static String post(String url, Map&String, String& params) throws IOException, ExecutionException, InterruptedException {
AsyncHttpClient http = new AsyncHttpClient();
AsyncHttpClient.BoundRequestBuilder builder = http.preparePost(url);
builder.setBodyEncoding(DEFAULT_CHARSET);
if (params != null && !params.isEmpty()) {
Set&String& keys = params.keySet();
for (String key : keys) {
builder.addParameter(key, params.get(key));
Future&Response& f = builder.execute();
String body = f.get().getResponseBody(DEFAULT_CHARSET);
http.close();
public static String post(String url, String s) throws IOException, ExecutionException, InterruptedException {
AsyncHttpClient http = new AsyncHttpClient();
AsyncHttpClient.BoundRequestBuilder builder = http.preparePost(url);
builder.setBodyEncoding(DEFAULT_CHARSET);
builder.setBody(s);
Future&Response& f = builder.execute();
String body = f.get().getResponseBody(DEFAULT_CHARSET);
http.close();
支付工具类pay.java
* 支付相关方法
* @author andy
public class Pay {
// 发货通知接口
private static final String DELIVERNOTIFY_URL = "https://api./pay/delivernotify?access_token=";
* 参与 paySign 签名的字段包括:appid、timestamp、noncestr、package 以及 appkey。
* 这里 signType 并不参与签名微信的Package参数
* @param params
* @throws UnsupportedEncodingException
public static String getPackage(Map&String, String& params) throws UnsupportedEncodingException {
String partnerKey = ConfKit.get("partnerKey");
String partnerId = ConfKit.get("partnerId");
String notifyUrl = ConfKit.get("notify_url");
// 公共参数
params.put("bank_type", "WX");
params.put("attach", "yongle");
params.put("partner", partnerId);
params.put("notify_url", notifyUrl);
params.put("input_charset", "UTF-8");
return packageSign(params, partnerKey);
* 构造签名
* @param params
* @param encode
* @throws UnsupportedEncodingException
public static String createSign(Map&String, String& params, boolean encode) throws UnsupportedEncodingException {
Set&String& keysSet = params.keySet();
Object[] keys = keysSet.toArray();
Arrays.sort(keys);
StringBuffer temp = new StringBuffer();
boolean first =
for (Object key : keys) {
if (first) {
temp.append("&");
temp.append(key).append("=");
Object value = params.get(key);
String valueString = "";
if (null != value) {
valueString = value.toString();
if (encode) {
temp.append(URLEncoder.encode(valueString, "UTF-8"));
temp.append(valueString);
return temp.toString();
* @param params
* @param paternerKey
* @throws UnsupportedEncodingException
private static String packageSign(Map&String, String& params, String paternerKey) throws UnsupportedEncodingException {
String string1 = createSign(params, false);
String stringSignTemp = string1 + "&key=" + paternerK
String signValue = DigestUtils.md5Hex(stringSignTemp).toUpperCase();
String string2 = createSign(params, true);
return string2 + "&sign=" + signV
* 支付签名
* @param timestamp
* @param noncestr
* @param packages
* @throws UnsupportedEncodingException
public static String paySign(String timestamp, String noncestr,String packages) throws UnsupportedEncodingException {
Map&String, String& paras = new HashMap&String, String&();
paras.put("appid", ConfKit.get("AppId"));
paras.put("timestamp", timestamp);
paras.put("noncestr", noncestr);
paras.put("package", packages);
paras.put("appkey", ConfKit.get("paySignKey"));
// appid、timestamp、noncestr、package 以及 appkey。
String string1 = createSign(paras, false);
String paySign = DigestUtils.shaHex(string1);
return payS
* 支付回调校验签名
* @param timestamp
* @param noncestr
* @param openid
* @param issubscribe
* @param appsignature
* @throws UnsupportedEncodingException
public static boolean verifySign(long timestamp,
String noncestr, String openid, int issubscribe, String appsignature) throws UnsupportedEncodingException {
Map&String, String& paras = new HashMap&String, String&();
paras.put("appid", ConfKit.get("AppId"));
paras.put("appkey", ConfKit.get("paySignKey"));
paras.put("timestamp", String.valueOf(timestamp));
paras.put("noncestr", noncestr);
paras.put("openid", openid);
paras.put("issubscribe", String.valueOf(issubscribe));
// appid、appkey、productid、timestamp、noncestr、openid、issubscribe
String string1 = createSign(paras, false);
String paySign = DigestUtils.shaHex(string1);
return paySign.equalsIgnoreCase(appsignature);
* 发货通知签名
* @param paras
* @throws UnsupportedEncodingException
* @参数 appid、appkey、openid、transid、out_trade_no、deliver_timestamp、deliver_status、deliver_msg;
private static String deliverSign(Map&String, String& paras) throws UnsupportedEncodingException {
paras.put("appkey", ConfKit.get("paySignKey"));
String string1 = createSign(paras, false);
String paySign = DigestUtils.shaHex(string1);
return payS
* 发货通知
* @param access_token
* @param openid
* @param transid
* @param out_trade_no
* @throws IOException
* @throws NoSuchProviderException
* @throws NoSuchAlgorithmException
* @throws KeyManagementException
* @throws InterruptedException
* @throws ExecutionException
public static boolean delivernotify(String access_token, String openid, String transid, String out_trade_no) throws IOException, ExecutionException, InterruptedException {
Map&String, String& paras = new HashMap&String, String&();
paras.put("appid", ConfKit.get("AppId"));
paras.put("openid", openid);
paras.put("transid", transid);
paras.put("out_trade_no", out_trade_no);
paras.put("deliver_timestamp", (System.currentTimeMillis() / 1000) + "");
paras.put("deliver_status", "1");
paras.put("deliver_msg", "ok");
String app_signature = deliverSign(paras);
paras.put("app_signature", app_signature);
paras.put("sign_method", "sha1");
String json = HttpKit.post(DELIVERNOTIFY_URL.concat(access_token), JSONObject.toJSONString(paras));
if (StringUtils.isNotBlank(json)) {
JSONObject object = JSONObject.parseObject(json);
if (object.containsKey("errcode")) {
int errcode = object.getIntValue("errcode");
return errcode == 0;
流转化Tools.java工具类
public final class Tools {
public static final String inputStream2String(InputStream in) throws UnsupportedEncodingException, IOException{
if(in == null)
return "";
StringBuffer out = new StringBuffer();
byte[] b = new byte[4096];
for ( (n = in.read(b)) != -1;) {
out.append(new String(b, 0, n, "UTF-8"));
return out.toString();
public static final boolean checkSignature(String token,String signature,String timestamp,String nonce){
List&String& params = new ArrayList&String&();
params.add(token);
params.add(timestamp);
params.add(nonce);
Collections.sort(params,new Comparator&String&() {
public int compare(String o1, String o2) {
pareTo(o2);
String temp = params.get(0)+params.get(1)+params.get(2);
return SHA1.encode(temp).equals(signature);
相应前端数据工具WebUtil.java工具类
public class WebUtil {
public static Object getSessionAttribute(HttpServletRequest req, String key) {
Object ret =
ret = req.getSession(false).getAttribute(key);
} catch (Exception e) {
public static void response(HttpServletResponse response, String result) {
response.setContentType("application/charset=utf-8");
response.getWriter().write(result);
} catch (IOException e) {
e.printStackTrace();
public static void response(HttpServletResponse response, ResponseMessage result) {
response.setContentType("application/charset=utf-8");
response.getWriter().write(JsonUtil.objectToJsonNode(result).toString());
} catch (Exception e) {
e.printStackTrace();
public static String packJsonp(String callback, String json) {
if (json == null) {
json = "";
if (callback == null || callback.isEmpty()) {
return callback + "&&" + callback + '(' + json + ')';
public static String packJsonp(String callback, ResponseMessage response) {
String json =
if (response == null) {
json = "";
json = JsonUtil.objectToJsonNode(response).toString();
if (callback == null || callback.isEmpty()) {
return callback + "&&" + callback + '(' + json + ')';
Json转换工具JsonUtil.java
public class JsonUtil {
public static ObjectNode warpJsonNodeResponse(JsonNode obj){
ObjectNode objectNode=createObjectNode();
objectNode.put("code", 1);
objectNode.put("response", obj);
return objectN
public static JsonNode objectToJsonNode(Object obj){
ObjectMapper objectMapper = new ObjectMapper();
String objJson=objectMapper.writeValueAsString(obj);
JsonNode jsonNode = objectMapper.readTree(objJson);
return jsonN
} catch (JsonProcessingException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
四、微信H5调起支付
这个url需要后台实现,其实现功能如下:
1、接受微信服务器端发送的支付结果。
2、向微信服务器发送支付结果
具体 参考微信aip(http://pay./wiki/doc/api/index.php?chapter=9_7)
具体代码如下:4.1、授权向后台发起生成统一下订单页面wxrepay.jsp
&%@ page language="java" contentType="text/ charset=UTF-8" pageEncoding="UTF-8"%&
&%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %&
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
long t = System.currentTimeMillis();
&!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&
&meta charset="utf-8" /&
&meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" /&
&meta name="apple-mobile-web-app-capable" content="yes" /&
&meta name="apple-mobile-web-app-status-bar-style" content="black" /&
&meta name="format-detection" content="telephone=no" /&
&title&微信公众号支付&/title&
&link href="../css/css.css?t=&%=t%&" rel="stylesheet" type="text/css"&
&div class="index_box"&
&div class="apply_name"&商品&/div&
&div class="branch_con"&
&li&&span class="name"&beacon 1分钱 1只&/span&&/li&
&li&&span class="name"&测试支付信息&/span&&/li&
&p class="cz_btn"&&a href="javascript:reppay();" class="btn_1"&确定购买&/a&&/p&
&script type="text/javascript" src="../js/common.js?t=&%=t%&"&&/script&
&script type="text/javascript" &
var code = urlparameter("code");
function reppay(){
ajaxUtil({}, mainpath+"/pay/wxprepay.shtml?code=" + code, repay);
function repay(response){
var info =
var url = "wxpay?appId=" + info.appId + "&timeStamp=" +info.timeStamp + "&nonceStr=" + info.nonceStr +
"&pg=" +info.pg + "&signType=" +info.signType + "&paySign=" +info.payS
window.location.href= url + "&showwxpaytitle=1";
首先是请求服务端wxprepay.shml接口,后台向微信支付平台获取支付订单信息,返回前台,wxpay.jsp页面4.2、确认支付页面
&%@ page language="java" contentType="text/ charset=UTF-8" pageEncoding="UTF-8"%&
&%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %&
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
long t = System.currentTimeMillis();
&!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&
&meta charset="utf-8" /&
&meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" /&
&meta name="apple-mobile-web-app-capable" content="yes" /&
&meta name="apple-mobile-web-app-status-bar-style" content="black" /&
&meta name="format-detection" content="telephone=no" /&
&title&微信公众号支付&/title&
&link href="../css/css.css?t=&%=t%&" rel="stylesheet" type="text/css"&
&div class="index_box"&
&div class="apply_name"&微信js支付测试&/div&
&div class="branch_con"&
&li&&span class="name"&测试支付信息&/span&&/li&
&p class="cz_btn"&&a href="javascript:pay();" class="btn_1"&立即支付&/a&&/p&
&script type="text/javascript" src="../js/common.js?t=&%=t%&"&&/script&
&script type="text/javascript"&
var appId = urlparameter("appId");
var timeStamp = urlparameter("timeStamp");
var nonceStr = urlparameter("nonceStr");
var pg = urlparameter("pg");
var signType = urlparameter("signType");
var paySign = urlparameter("paySign");
function onBridgeReady(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId" : appId, //公众号名称,由商户传入
"timeStamp": timeStamp, //时间戳,自1970年以来的秒数
"nonceStr" : nonceStr, //随机串
"package" : "prepay_id=" + pg,
"signType" : signType, //微信签名方式:
"paySign" : paySign //微信签名
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ) {
alert("支付成功");
} // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。
function pay(){
if (typeof WeixinJSBridge == "undefined"){
if( document.addEventListener ){
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
}else if (document.attachEvent){
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
onBridgeReady();
4.2、前台涉及到的工具类javascript工具类common.js,样式css.css就不贴了没意义。
var path="wxpay";
var mainpath = "/wxpay";
var appid = "wx16691fcb";
var urlpre = "/wxpay/page";
var urlhost = "/";
$(document).ready(function(){
$(".refresher").click(function(){
refresh();
$("#goback").click(function(){
function popupMsg(msg){
alert(msg);
function printUtilViaGet(panel, requestdata, ajaxurl, printfunction){
type: 'GET',
url: ajaxurl,
data: requestdata,
cache:false,
dataType:"json",
async: false,
success: function(response) {
if (response.code){
if (panel != null && panel.length & 0){
$(panel).html("");
if (printfunction != null)
$(panel).html(printfunction(response.response));
//alert(response.reason);
error: function(x, e) {
//alert("error", x);
complete: function(x) {
//alert("call complete");
function ajaxUtilViaGet(requestdata, ajaxurl, succFunction, failFunction){
url: ajaxurl,
type: "GET",
dataType: "json",
cache:false,
data: requestdata,
async: false,
success: function(response) {
if (response.code){
if (succFunction != null)
succFunction(response.response);
if (failFunction != null)
failFunction(response.response);
error: function(x, e) {
//alert("error", x);
complete: function(x) {
function printUtil(panel, requestdata, ajaxurl, printfunction, ajaxasync) {
if (isEmpty(ajaxasync)) {
ajaxasync =
type : 'POST',
url : ajaxurl,
data : requestdata,
cache : false,
dataType : "json",
async : ajaxasync,
success : function(response) {
if (response.code) {
if (panel != null && panel.length & 0) {
$(panel).html("");
if (printfunction != null)
$(panel).html(printfunction(response.response));
// alert(response.reason);
error : function(x, e) {
// alert("error", x);
complete : function(x) {
// alert("call complete");
function appendUtil(panel, requestdata, ajaxurl, printfunction, ajaxasync) {
if (isEmpty(ajaxasync)) {
ajaxasync =
type : 'POST',
url : ajaxurl,
data : requestdata,
cache : false,
dataType : "json",
async : ajaxasync,
success : function(response) {
if (response.code) {
if (panel != null && panel.length & 0) {
if (printfunction != null)
$(panel).append(printfunction(response.response));
// alert(response.reason);
error : function(x, e) {
// alert("error", x);
complete : function(x) {
// alert("call complete");
function ajaxUtilAsync(requestdata, ajaxurl, succFunction, failFunction) {
url : ajaxurl,
type : "POST",
dataType : "json",
cache : false,
data : requestdata,
async : true,
success : function(response) {
if (typeof response.code == "number") {
if (response.code & 0) {
if (succFunction != null)
succFunction(response.response);
if (failFunction != null)
failFunction(response.response);
if (response.result) {
if (succFunction != null)
succFunction(response.response);
if (failFunction != null)
failFunction(response.response);
error : function(x, e) {
// alert("error", x);
complete : function(x) {
function ajaxUtil(requestdata, ajaxurl, succFunction, failFunction){
url: ajaxurl,
type: "POST",
dataType: "json",
cache:false,
data: requestdata,
async: false,
success: function(response) {
if (typeof response.code == "number"){
if (response.code & 0){
if (succFunction != null)
succFunction(response.response);
if (failFunction != null)
failFunction(response.response);
if (response.result){
if (succFunction != null)
succFunction(response.response);
if (failFunction != null)
failFunction(response.response);
error: function(x, e) {
//alert("error", x);
complete: function(x) {
function loadSelection(panel, requestdata, ajaxurl, itemName){
ajaxUtil(requestdata, ajaxurl, function(response){
var list = response.
for (var i = 0;i&list.i++){
$(panel).append("&option value='"+list[i][itemName]+"'&"+list[i][itemName]+"&/option&");
function ajaxSubmitRefresh(formId) {
var hideForm = $(formId);
var options = {
dataType : "json",
beforeSubmit : function() {
success : function(result) {
if (result.result){
showMsg("提交成功");
alert("提交失败!");
error : function(result) {
alert("提交失败!");
hideForm.ajaxSubmit(options);
function ajaxSubmitWithJump(formId, nextPage) {
var hideForm = $(formId);
var options = {
dataType : "json",
beforeSubmit : function() {
success : function(result) {
if (result.result){
alert("提交成功");
window.location.href = nextP
alert("提交失败!");
error : function(result) {
alert("提交失败!");
hideForm.ajaxSubmit(options);
function refresh(){
window.location.href = window.location.
function goback(){
history.go(-1);
function urlparameter(paras){
var url = location.
var paraString = url.substring(url.indexOf("?")+1,url.length).split("&");
var paraObj = {};
for (var i=0; j=paraString[i]; i++){
paraObj[j.substring(0,j.indexOf("=")).toLowerCase()] = j.substring(j.indexOf("=")+1,j.length);
var returnValue = paraObj[paras.toLowerCase()];
if(typeof(returnValue)=="undefined"){
return "";
return returnV
String.prototype.endWith=function(str){
if(str==null||str==""||this.length==0||str.length&this.length)
if(this.substring(this.length-str.length)==str)
String.prototype.startWith=function(str){
if(str==null||str==""||this.length==0||str.length&this.length)
if(this.substr(0,str.length)==str)
function getFileUrl(sourceId) {
var url = "";
if (navigator.userAgent.indexOf("MSIE")&=1) { // IE
url = document.getElementById(sourceId).
} else if(navigator.userAgent.indexOf("Firefox")&0) { // Firefox
url = window.URL.createObjectURL(document.getElementById(sourceId).files.item(0));
} else if(navigator.userAgent.indexOf("Chrome")&0) { // Chrome
url = window.URL.createObjectURL(document.getElementById(sourceId).files.item(0));
function preImg(sourceId, targetId) {
var url = getFileUrl(sourceId);
var imgPre = document.getElementById(targetId);
imgPre.src =
function initWX(){
url:mainpath+'/wechatjs.do',
type:'POST',
dataType:'json',
async: false,
data: {url:location.href.split('#')[0]},
success:function(result){
console.log(result);
var data=result['response']['map'];
if(result['code']==1){
wx.config({
debug: false,
appId:data['appId'],
timestamp:data['timestamp'],
nonceStr:data['nonceStr'],
signature:data['signature'],
jsApiList: ['onMenuShareTimeline','onMenuShareAppMessage','getLocation', 'onMenuShareQQ', 'onMenuShareWeibo']
alert("fail to get code");
window.alert('fail');
var EARTH_RADIUS = ; //单位M
var PI = Math.PI;
function getRad(d){
return d*PI/180.0;
function getGreatCircleDistance(lat1,lng1,lat2,lng2){
var radLat1 = getRad(lat1);
var radLat2 = getRad(lat2);
var a = radLat1 - radLat2;
var b = getRad(lng1) - getRad(lng2);
var s = 2*Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) + Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));
s = s*EARTH_RADIUS;
s = Math.round(s*1.0;
s = Math.round(s);
//对Date的扩展,将 Date 转化为指定格式的String
//月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
//年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
//(new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==&
08:09:04.423
//(new Date()).Format("yyyy-M-d h:m:s.S") ==&
Date.prototype.format = function(fmt)
{ //author: meizz
"M+" : this.getMonth()+1,
"d+" : this.getDate(),
"h+" : this.getHours(),
"m+" : this.getMinutes(),
"s+" : this.getSeconds(),
"q+" : Math.floor((this.getMonth()+3)/3), //季度
"S" : this.getMilliseconds() //毫秒
if(/(y+)/.test(fmt))
fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
for(var k in o)
if(new RegExp("("+ k +")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
//判断为空
function isEmpty(src){
if(("undefined" == typeof src) || (src == null) || ($.trim(src) == "") ){
//判断不为空
function notEmpty(src){
return !isEmpty(src);
//微信页面授权 snsapi_base方式
function wecharauto2burl(url) {
return "https://open./connect/oauth2/authorize?appid=" + appid
+ "&redirect_uri=" + encodeURIComponent(url)
+ "&response_type=code&scope=snsapi_base&state=xybank#wechat_redirect";
//页面授权针对snsapi_base方式授权的url
function wecharauto2baseurl(url) {
return wecharauto2burl(urlpre+url);
//页面授权针对snsapi_userinfo方式授权的url
function wecharauto2userinfourl(url) {
return "https://open./connect/oauth2/authorize?appid=" + appid
+ "&redirect_uri=" + encodeURIComponent(urlpre+url)
+ "&response_type=code&scope=snsapi_userinfo&state=xybank#wechat_redirect";
//微信分享 此方法需放在wx.ready中
function shareWeChat(title, link, imgUrl, desc){
wx.onMenuShareTimeline({
title: title, // 分享标题
link: link, // 分享链接
imgUrl: imgUrl, // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
cancel: function () {
// 用户取消分享后执行的回调函数
//分享给朋友
wx.onMenuShareAppMessage({
title: title, // 分享标题
desc: desc, // 分享描述
link: link, // 分享链接
imgUrl: imgUrl, // 分享图标
type: 'link', // 分享类型,music、video或link,不填默认为link
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function () {
// 用户确认分享后执行的回调函数
cancel: function () {
// 用户取消分享后执行的回调函数
//分享到QQ
wx.onMenuShareQQ({
title: title, // 分享标题
desc: desc, // 分享描述
link: link, // 分享链接
imgUrl: imgUrl, // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
cancel: function () {
// 用户取消分享后执行的回调函数
//分享到腾讯微博
wx.onMenuShareWeibo({
title: title, // 分享标题
desc: desc, // 分享描述
link: link, // 分享链接
imgUrl: imgUrl, // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
cancel: function () {
// 用户取消分享后执行的回调函数
五、支付结果
公众号调起效果如下:
支付成功后,微信服务器得到后台的Notify通知后,会发微信说明支付信息,支付凭证如下:
后续会全部更新微信app支付,微信支付退款,微信企业向个人付款,支付宝相关支付。而且会上传全部代码到csdn资源下载处,尽请关注。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持云栖社区。
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索微信支付
微信h5支付
公众号开发支付
微信公众号支付
h5调用微信支付、h5调用支付宝支付接口、h5页面调用支付宝app、h5 页面调用微信支付、h5调用微信支付接口,以便于您获取更多的相关知识。
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
开发者常用软件,超百款实用软件一站式提供
云栖社区()为您免费提供相关信息,包括
,所有相关内容均不代表云栖社区的意见!

我要回帖

更多关于 调用微信支付接口 的文章

 

随机推荐