微信余额转账限额解决微信余额转账限额扫码支付限额额怎么解决 csdn

微信支付开发中的“坑”与解决之道
发表于 17:43|
来源《程序员》电子刊|
作者刘运强
摘要:微信支付是腾讯公司的支付业务品牌,它提供公众号支付、扫码支付等支付方式,并且还提供代金券、现金红包等营销工具。微信支付结合微信公众号,是移动支付的首选。现在来介绍一下微信支付开发中的各种“坑”。
微信支付是腾讯公司的支付业务品牌,它提供公众号支付、扫码支付、APP支付、刷卡支付等支付方式,并且还提供代金券、现金红包、企业付款等营销工具。微信支付结合微信公众号,全面打通O2O生活消费领域,提供专业的互联网+行业解决方案,是移动支付的首选。日,微信5.0版本引入了微信支付功能。日,腾讯发布了“2015微信用户数据报告”,报告称微信支付用户数达到4亿左右,可见微信支付的发展速度非常惊人。我有幸于2013年6月微信支付内测期间就开始接触微信支付开发,亲眼见证了微信支付的每一次成长。在此期间,有许多初学者向我咨询微信支付开发。今天,我就来吐槽一下微信支付开发中的各种“坑”。V2和V3差异大微信支付接口现在分为V2版和V3版,日之前申请的为V2版,之后申请的为V3版。这两个版本在功能和接口上都有很大差别,不能互用,开发时要特别注意这一点,否则可能会走很多弯路。开发文档混乱微信公众平台开发者文档位于http://mp./wiki/,相信大家都比较熟悉,然而有意思的是,这里面唯独没有微信支付的接口文档。微信支付的接口文档要登录微信公众平台才能看得到,如图1所示。图1 微信支付接口文档噢,原来藏在这里,也不算难找嘛!然而,仔细观察会发现这里没有代金券、现金红包、企业付款等接口的说明。如果要查看所有的微信支付接口文档,需要去微信支付商户平台,访问地址为https://pay./wiki/doc/api/index.html,如图2所示。图2 微信支付商户平台开发者文档签名算法为了保证数据安全,微信支付要求所有发送或接收的数据都必须经过签名,相信不少开发者都在签名算法上吃过亏。下面是生成签名时的一些注意事项和经验分享。【参数按字典序排序】需要特别注意的是,参数名严格区分大小写,并且值为空的参数不参与签名。最让我记忆犹新的是开发“收货地址共享接口”,调用接口需要传递的参数(appId、timeStamp和nonceStr)在签名时都必须小写。至于参数按字典序排序,在Java中,可以采用SortedMap来实现,非常简便,不建议开发者自己实现排序算法。【MD5和SHA1算法】在微信支付相关的接口中,“收货地址共享接口”使用SHA1算法进行签名,除此之外的其他接口都使用MD5算法进行签名。对于大多数开发者而言,编写SHA1和MD5算法是有一定难度的,虽然最终的实现代码只有几行。在Java中,可以采用Apache Commons Codec工具包来实现标准的MD5和SHA-1,示例代码如下:String source = "签名测试";
String md5 = DigestUtils.md5Hex(source);
System.out.println("md5签名结果:" + md5);
String sha1 = DigestUtils.sha1Hex(source);
System.out.println("sha1签名结果:" + sha1);说明:运行以上示例需要在工程中引入jar包commons-codec-1.9.jar。另外,需要注意的是,在“收货地址共享接口”中,官方给出的SHA1签名示例的结果是错误的,这估计误导了很多开多者,让他们误以为自己的签名算法有误。官方示例如下经我测试,上述示例中SHA1签名后的正确结果为:双向证书首先,我们来简单认识一下SSL证书、单向认证和双向认证。SSL证书是由受信任的数字证书颁发机构CA(如GlobalSign,WoSign),在验证服务器身份后颁发的,具有服务器身份验证和数据传输加密的功能。单向认证是指在SSL通信过程中,客户端需要验证服务器证书的合法性,而服务器端不对客户端证书进行校验。双向认证是指在SSL通信过程中,客户端需要验证服务器证书的合法性,服务器端也需要验证客户端证书的合法性。在微信支付开发中,申请退款、发放现金红包、发放裂变红包等接口需要用到商户证书,微信服务器会验证商户证书的合法性。API证书文件可按以下路径下载:下载到API证书之后,该如何在程序中使用呢?这就需要使用KeyManagerFactory类和KeyStore类,在程序中设定客户端使用的证书。核心代码如下:// 证书文件(微信商户平台-账户设置-API安全-API证书-下载证书)
String keyStorePath = "D:/apiclient_cert.p12";
// 证书密码(默认为商户ID)
String password = WxPayUtil.
// 实例化密钥库
KeyStore ks = KeyStore.getInstance("PKCS12");
// 获得密钥库文件流
FileInputStream fis = new FileInputStream(keyStorePath);
// 加载密钥库
ks.load(fis, password.toCharArray());
// 关闭密钥库文件流
fis.close();
// 实例化密钥库
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
// 初始化密钥工厂
kmf.init(ks, password.toCharArray());
// 创建SSLContext
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(kmf.getKeyManagers(), null, new SecureRandom());
// 获取SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestMethod(requestMethod);
// 设置当前实例使用的SSLSocketFactory
conn.setSSLSocketFactory(ssf);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.connect();希望本篇文章能够帮助开发者顺利避开微信支付开发的各种“坑”,快速掌握微信支付接口的使用。作者简介刘运强,网名“柳峰”,Java软件开发工程师、Android/iOS移动应用开发工程师,国内微信公众平台应用开发的先驱之一,常年活跃在CSDN社区,并在CSDN博客撰写了系列微信公众平台二次开发的教程,深受欢迎并被广泛传播,也因此获得了CSDN2013年度博客之星。著有《微信公众平台应用开发:方法、技巧与案例》一书。本文选自程序员电子版2015年11月B刊,该期更多文章请查看。2000年创刊至今所有文章目录请查看。欢迎(含iPad版、Android版、PDF版)。&
推荐阅读相关主题:
为了更好帮助企业深入了解国内外最新大数据技术,掌握更多行业大数据实践经验,进一步推进大数据技术创新、行业应用和人才培养,-12日,由中国计算机学会(CCF)主办,CCF大数据专家委员会承办,中国科学院计算技术研究所、北京中科天玑科技有限公司及CSDN共同协办的2015中国大数据技术大会(Big Data Technology Conference 2015,BDTC 2015)将在北京新云南皇冠假日酒店隆重举办。
相关热门文章JAVA微信扫码支付模式一功能实现 - CSDN博客
JAVA微信扫码支付模式一功能实现
一、准备工作4月份那会发了篇关于&JAVA微信扫码支付模式二功能实现的博客,无数人来追问模式一的开发,所以在这就贴出来,仅供参考。关于模式一和模式二的区别,我有解释过很多次,无非就是模式一的二维码是针对商品的,模式二的二维码是针对订单的,其他具体细节我就不费口舌了,各位可以自行去官方查看文档,然后是选模式一还是模式二就得看自己的业务了。1.1、有关配置参数还是之前那四样,APP_ID和APP_SECRET可以在公众平台找着,MCH_ID和API_KEY则在商户平台找到,特别是API_KEY要在商户平台设置好,这个东东关系到参数校验的正确与否,所以一定要设置正确。扫码支付模式一其实与扫码支付模式二类似,实际只会用到APP_ID、MCH_ID和API_KEY,其他的都不用。模式一的官方文档地址在这:1.2、有关概念在这里我想先修正一个概念,在之前模式二开发过程中我曾提到了一个“支付回调地址”这样的概念,其作用实际就是客户在扫描完成支付后,微信服务器要访问我们提供的这个地址,给我们发送支付结果,以便我们核实订单进行发货,这是其他支付工具比较普遍的概念和叫法。不过后来我翻了一下微信官网的文档,发现在模式一开发中,他们把这个叫做“异步通知url”而不是什么“支付回调地址”,但本质这指的是一个意思。可是为什么我要在这提到这个东东呢?这是因为在模式一中,实际上还有另外一个所谓的“支付回调”称之为“扫码支付回调URL”,这东东与上面的“异步通知url”可就不一样了,简单理解可以认为是咱们的服务器上一个用来辅助完成下单的接口。模式一的开发同时需要“扫码支付回调URL”与“异步通知url”两个接口配合才能完成,所以这里大家要辨别好了。“异步通知url”在调用统一下单接口时进行设置,可以动态设置,只要这个接口按照有关规则接收参数响应参数即可。而“扫码支付回调URL”则较为固定,它在微信公众平台设置,设置后需要10分钟左右才能生效,大家登录微信公众平台后,选择微信支付,在开发配置选项卡下面就可以找着:这里咱们要设置一个自己服务器的地址(再说一遍公网地址,就是让微信服务器能找着你)。1.3、开发环境我这里以最基本的Servlet 3.0作为示例环境。关于引用第三方的jar包,相比较于模式二开发,除了用到了xml操作的jdom,以外就一个Google ZXing的二维码包和log4j包。如下图:为了方便调试,建议各位先在这个环境下调通了再移植到真实项目当中去。二、开发实战在动手之前,我建议大家先去官方文档那好好看看那个时序图,理解了那个时序图,写代码也就不是什么难事了,当然如果看图你没办法理解,也可以结合我下面的代码来试着理解。2.1、二维码生成首先是二维码,二维码中的内容为链接,形式为:weixin://wxpay/bizpayurl?sign=XXXXX&appid=XXXXX&mch_id=XXXXX&product_id=XXXXXX&time_stamp=XXXXXX&nonce_str=XXXXX具体可以参考官方文档模式一生成二维码规则。接下来我们需要将该链接生成二维码,我这里使用了Google ZXing来生成二维码。package com.
import java.io.IOE
import java.io.OutputS
import java.util.HashM
import java.util.I
import java.util.M
import java.util.S
import java.util.SortedM
import java.util.TreeM
import javax.servlet.ServletE
import javax.servlet.annotation.WebS
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import org.apache.log4j.L
import com.google.zxing.BarcodeF
import com.google.zxing.EncodeHintT
import com.google.zxing.MultiFormatW
import com.google.zxing.WriterE
import com.google.zxing.client.j2se.MatrixToImageW
import com.mon.BitM
import com.google.zxing.qrcode.decoder.ErrorCorrectionL
import com.wqy.util.PayCommonU
import com.wqy.util.PayConfigU
* Servlet implementation class Pay1
@WebServlet(&/Pay1&)
public class Pay1 extends HttpServlet {
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(Pay1.class);
public static int defaultWidthAndHeight=200;
* @see HttpServlet#HttpServlet()
public Pay1() {
// TODO Auto-generated constructor stub
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
String nonce_str = PayCommonUtil.getNonce_str();
long time_stamp = System.currentTimeMillis() / 1000;
String product_id = &hd_goodsssss_10&;
String key = PayConfigUtil.API_KEY; // key
SortedMap&Object, Object& packageParams = new TreeMap&Object, Object&();
packageParams.put(&appid&, PayConfigUtil.APP_ID);
packageParams.put(&mch_id&, PayConfigUtil.MCH_ID);
packageParams.put(&time_stamp&, String.valueOf(time_stamp));
packageParams.put(&nonce_str&, nonce_str);
packageParams.put(&product_id&, product_id);
String sign = PayCommonUtil.createSign(&UTF-8&, packageParams,key);//MD5哈希
packageParams.put(&sign&, sign);
//生成参数
String str = ToUrlParams(packageParams);
String payurl = &weixin://wxpay/bizpayurl?& +
(&payurl:&+payurl);
//生成二维码
Map&EncodeHintType, Object&
hints=new HashMap&EncodeHintType, Object&();
// 指定纠错等级
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
// 指定编码格式
hints.put(EncodeHintType.CHARACTER_SET, &UTF-8&);
hints.put(EncodeHintType.MARGIN, 1);
BitMatrix bitMatrix = new MultiFormatWriter().encode(payurl,BarcodeFormat.QR_CODE, defaultWidthAndHeight, defaultWidthAndHeight, hints);
OutputStream out = response.getOutputStream();
MatrixToImageWriter.writeToStream(bitMatrix, &png&, out);//输出二维码
out.flush();
out.close();
} catch (WriterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
public String ToUrlParams(SortedMap&Object, Object& 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)) {
sb.append(k + &=& + v + &&&);
sb.deleteCharAt(sb.length()-1);//删掉最后一个&
return sb.toString();
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
2.2、扫描支付回调url接口当客户用微信扫了上面的二位码之后,微信服务器就会访问此接口,在这里我们要完成统一下单获取交易会话标识,处理的主要流程如下:1)、接收微信服务器发送过来的参数,对参数进行签名校验;2)、取出参数product_id,这是二维码上唯一能够透传过来的参数,其他参数可参照官方文档模式一3.1 输入参数;3)、根据product_id处理自己的业务,比如计算支付金额,生成订单号等;4)、调用统一下单接口获取交易会话标识prepay_id;&& &4.1)、准备好相关参数(如appid、mch_id、支付金额、订单号、商品描述等),调用微信统一下单接口(与模式二调用统一下单接口类似),留意一下这里要加上上面提到的“异步通知url”,也就是后面会说道的异步通知url接口,具体参数参考官方文档统一下单请求参数;&& &4.2)、接收统一下单接口返回的参数,对参数进行验签;&& &4.3)、取出参数prepay_id,这是交易会话标识,极其重要,其他参数可参考官方文档统一下单返回结果;5)、准备好相关参数(如appid、mch_id、return_code、prepay_id等),响应最开始的支付回调(如果上面步骤如果错误,如验签失败则可以返回错误参数给微信服务器),具体参数可参照官方文档模式一3.2 输出参数。package com.
import java.io.BufferedOutputS
import java.io.BufferedR
import java.io.IOE
import java.io.InputS
import java.io.InputStreamR
import java.util.SortedM
import java.util.TreeM
import javax.servlet.ServletE
import javax.servlet.annotation.WebS
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import org.apache.log4j.L
import com.wqy.util.HttpU
import com.wqy.util.PayCommonU
import com.wqy.util.PayConfigU
* Servlet implementation class Notify1
@WebServlet(&/Notify1&)
public class Notify1 extends HttpServlet {
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(Notify1.class);
* @see HttpServlet#HttpServlet()
public Notify1() {
// TODO Auto-generated constructor stub
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
// 读取xml
InputStream inputS
StringBuffer sb = new StringBuffer();
inputStream = request.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, &UTF-8&));
while ((s = in.readLine()) != null) {
sb.append(s);
in.close();
inputStream.close();
SortedMap&Object, Object& packageParams = PayCommonUtil.xmlConvertToMap(sb.toString());
(packageParams);
// 账号信息
String key = PayConfigUtil.API_KEY; // key
String resXml=&&;//反馈给微信服务器
if (PayCommonUtil.isTenpaySign(&UTF-8&, packageParams, key)) {
//appid openid mch_id is_subscribe nonce_str product_id sign
//统一下单
String openid = (String)packageParams.get(&openid&);
String product_id = (String)packageParams.get(&product_id&);
//解析product_id,计算价格等
String out_trade_no = String.valueOf(System.currentTimeMillis()); // 订单号
String order_price = &1&; // 价格
注意:价格的单位是分
String body = product_
// 商品名称
这里设置为product_id
String attach = &XXX店&; //附加数据
String nonce_str0 = PayCommonUtil.getNonce_str();
// 获取发起电脑 ip
String spbill_create_ip = PayConfigUtil.CREATE_IP;
String trade_type = &NATIVE&;
SortedMap&Object,Object& unifiedParams = new TreeMap&Object,Object&();
unifiedParams.put(&appid&, PayConfigUtil.APP_ID); // 必须
unifiedParams.put(&mch_id&, PayConfigUtil.MCH_ID); // 必须
unifiedParams.put(&out_trade_no&, out_trade_no); // 必须
unifiedParams.put(&product_id&, product_id);
unifiedParams.put(&body&, body); // 必须
unifiedParams.put(&attach&, attach);
unifiedParams.put(&total_fee&, order_price);
unifiedParams.put(&nonce_str&, nonce_str0);
unifiedParams.put(&spbill_create_ip&, spbill_create_ip); // 必须
unifiedParams.put(&trade_type&, trade_type); // 必须
unifiedParams.put(&openid&, openid);
unifiedParams.put(&notify_url&, PayConfigUtil.NOTIFY_URL);//异步通知url
String sign0 = PayCommonUtil.createSign(&UTF-8&, unifiedParams,key);
unifiedParams.put(&sign&, sign0); //签名
String requestXML = PayCommonUtil.getRequestXml(unifiedParams);
(requestXML);
//统一下单接口
String rXml = HttpUtil.postData(PayConfigUtil.UFDODER_URL, requestXML);
//统一下单响应
SortedMap&Object, Object& reParams = PayCommonUtil.xmlConvertToMap(rXml);
(reParams);
if (PayCommonUtil.isTenpaySign(&UTF-8&, reParams, key)) {
// 统一下单返回的参数
String prepay_id = (String)reParams.get(&prepay_id&);//交易会话标识
2小时内有效
String nonce_str1 = PayCommonUtil.getNonce_str();
SortedMap&Object,Object& resParams = new TreeMap&Object,Object&();
resParams.put(&return_code&, &SUCCESS&); // 必须
resParams.put(&return_msg&, &OK&);
resParams.put(&appid&, PayConfigUtil.APP_ID); // 必须
resParams.put(&mch_id&, PayConfigUtil.MCH_ID);
resParams.put(&nonce_str&, nonce_str1); // 必须
resParams.put(&prepay_id&, prepay_id); // 必须
resParams.put(&result_code&, &SUCCESS&); // 必须
resParams.put(&err_code_des&, &OK&);
String sign1 = PayCommonUtil.createSign(&UTF-8&, resParams,key);
resParams.put(&sign&, sign1); //签名
resXml = PayCommonUtil.getRequestXml(resParams);
(&签名验证错误&);
resXml = &&xml&& + &&return_code&&![CDATA[FAIL]]&&/return_code&&
+ &&return_msg&&![CDATA[签名验证错误]]&&/return_msg&& + &&/xml& &;
(&签名验证错误&);
resXml = &&xml&& + &&return_code&&![CDATA[FAIL]]&&/return_code&&
+ &&return_msg&&![CDATA[签名验证错误]]&&/return_msg&& + &&/xml& &;
//------------------------------
//处理业务完毕
//------------------------------
BufferedOutputStream out = new BufferedOutputStream(
response.getOutputStream());
out.write(resXml.getBytes());
out.flush();
out.close();
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
至此,用户的微信单就会显示出要支付的金额及商品描述等,接下来就是等待客户完成支付。2.3、异步通知url接口当用户在微信上完成支付操作后,微信服务器就会异步通知这个接口,给我们发送最终的支付结果,以便我们核实订单进行发货等操作,注意这个接口和模式二的开发是一模一样的。大概流程如下:1)、接收微信服务器发送过来的参数,对参数进行签名校验;2)、取出参数result_code、订单号out_trade_no、订单金额total_fee及其他业务相关的参数,具体参数可参照官方文档支付结果通用通知的通知参数;3)、处理业务,如校验订单号及订单金额、修改订单状态等;4)、准备好相关参数(return_code和return_msg),应答微信服务器。注意,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为15/15/30/180/00/,单位:秒)package com.
import java.io.BufferedOutputS
import java.io.BufferedR
import java.io.IOE
import java.io.InputS
import java.io.InputStreamR
import java.util.SortedM
import javax.servlet.ServletE
import javax.servlet.annotation.WebS
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import org.apache.log4j.L
import com.wqy.util.PayCommonU
import com.wqy.util.PayConfigU
* Servlet implementation class Re_notify
@WebServlet(&/Re_notify&)
public class Re_notify extends HttpServlet {
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(Re_notify.class);
* @see HttpServlet#HttpServlet()
public Re_notify() {
// TODO Auto-generated constructor stub
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
// 读取参数
InputStream inputS
StringBuffer sb = new StringBuffer();
inputStream = request.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, &UTF-8&));
while ((s = in.readLine()) != null) {
sb.append(s);
in.close();
inputStream.close();
SortedMap&Object, Object& packageParams = PayCommonUtil.xmlConvertToMap(sb.toString());
(packageParams);
// 账号信息
String key = PayConfigUtil.API_KEY; // key
String resXml = &&; // 反馈给微信服务器
// 判断签名是否正确
if (PayCommonUtil.isTenpaySign(&UTF-8&, packageParams, key)) {
// ------------------------------
// 处理业务开始
// ------------------------------
if (&SUCCESS&.equals((String) packageParams.get(&result_code&))) {
// 这里是支付成功
////////// 执行自己的业务逻辑////////////////
String mch_id = (String) packageParams.get(&mch_id&);
String openid = (String) packageParams.get(&openid&);
String is_subscribe = (String) packageParams.get(&is_subscribe&);
String out_trade_no = (String) packageParams.get(&out_trade_no&);
String total_fee = (String) packageParams.get(&total_fee&);
(&mch_id:& + mch_id);
(&openid:& + openid);
(&is_subscribe:& + is_subscribe);
(&out_trade_no:& + out_trade_no);
(&total_fee:& + total_fee);
////////// 执行自己的业务逻辑////////////////
(&支付成功&);
// 通知微信.异步确认成功.必写.不然会一直通知后台.八次之后就认为交易失败了.
resXml = &&xml&& + &&return_code&&![CDATA[SUCCESS]]&&/return_code&&
+ &&return_msg&&![CDATA[OK]]&&/return_msg&& + &&/xml& &;
(&支付失败,错误信息:& + packageParams.get(&err_code&));
resXml = &&xml&& + &&return_code&&![CDATA[FAIL]]&&/return_code&&
+ &&return_msg&&![CDATA[报文为空]]&&/return_msg&& + &&/xml& &;
(&签名验证错误&);
resXml = &&xml&& + &&return_code&&![CDATA[FAIL]]&&/return_code&&
+ &&return_msg&&![CDATA[签名验证错误]]&&/return_msg&& + &&/xml& &;
// ------------------------------
// 处理业务完毕
// ------------------------------
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
out.write(resXml.getBytes());
out.flush();
out.close();
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
三、测试结果3.1、生成的支付二维码链接3.2、支付回调url接口接收到的参数3.3、发起统一下单请求参数3.4、统一下单返回参数3.5、支付回调url接口最终的响应参数转载请注明:源码下载地址:
本文已收录于以下专栏:
相关文章推荐
一、准备工作首先吐槽一下微信关于支付这块,本身支持的支付模式就好几种,但是官方文档特别零散,连像样的JAVA相关的demo也没几个。本人之前没有搞过微信支付,一开始真是被它搞晕,折腾两天终于调通了,特...
最近开发网站过程,需要引入支付过程,第三方支付中最火的莫过于支付宝支付和微信支付,下边借助微信支付官网上的文档,写一下接入微信支付之扫码支付的流程
相对支付宝支付而言,微信支付的开发文档写的相当的l...
微信支付接口开发之--微信扫码支付
1)、生成支付链接或是二维码
链接格式如下:
weixin://wxpay/bizpayurl?appid=wxa842e8005c...
支付项目采用springMvc+Dubbo架构实现,只对外提供接口
前期酝酿准备
最近项目中要上线支付功能、前段时间刚开发完微信的扫码支付、不得不说微信开发团队的文档真是一个烂。但总算是对照着A...
微信支付现在已经变得越来越流行了,随之也出现了很多以可以快速接入微信支付为噱头的产品,不过方便之余也使得我们做东西慢慢依赖第三方,丧失了独立思考的能力,这次打算分享下我之前开发过的微信支付。
微信支付-扫码(java)
原文地址:/archives/180/
支付项目采用springMvc+Dubbo架构实现,只对外提供接口。
话说,为什么微信支付比...
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 微信余额限额怎么提高 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信