微信NATIVE静态支付(V3版本)

微信native支付也叫扫码原生支付,场景就是用户用微信的扫一扫,扫描一个商品的二维码,扫码成功后会出现支付界面进行付款。然而扫码原生支付又分为两种:静态native支付和动态native支付。这两种又有什么区别呢?通俗来讲,静态native支付就是我们可以将一个商品的信息做成一个二维码,比如一瓶可口可乐,该商品的信息变成二维码后多个用户都可以扫描该二维码进行付款购买商品。那么动态native支付又是什么呢?其实动态native支付也是将一个商品信息变成二维码,与静态native支付的区别就是,该二维码信息中有一个订单号的信息在里面,一个用户付款成功后,该二维码就不能被其他用户扫描支付。知道这两种扫码原生支付区别,我们可以根据我们自己的需求进行选择开发。下面我们来进行静态native支付。

开发之前,我们需要到登陆自己的服务号,进行设置原生支付URL。

步骤请参考官方文档:http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=6_3

该原生支付URL的作用就是接收用户扫码二维码后微信支付系统返回的信息,根据返回的信息进行支付操作。

具体详细流程和参数意义请参考官方文档:http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=6_4

参考代码如下:

package com.wingo.action.config;

import java.io.ByteArrayOutputStream;

import java.io.InputStream;

import java.util.Date;

import java.util.Map;

import java.util.SortedMap;

import java.util.TreeMap;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.wingo.util.CommonUtil;

import com.wingo.util.ConfigUtil;

import com.wingo.util.IpAddressUtil;

import com.wingo.util.PayCommonUtil;

import com.wingo.util.XMLUtil;

/**

*

* @author 李欣桦

* @date 2015-1-6下午5:14:29

*

* 静态native支付

*/

public class StaticNativeAction {

/**

* @author 李欣桦

* @date 2015-1-15上午10:06:18

* @Description:native静态支付生成二维码

* @param args

* @throws Exception

*/

public static void main(String[] args) throws Exception {

SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();

parameters.put("appid", ConfigUtil.APPID);

parameters.put("mch_id", ConfigUtil.MCH_ID);

parameters.put("time_stamp", Long.toString(new Date().getTime()));

parameters.put("nonce_str", PayCommonUtil.CreateNoncestr());

parameters.put("product_id", "No.201401051607001");//商品号要唯一

String sign = PayCommonUtil.createSign("UTF-8", parameters);

parameters.put("sign", sign);

String url = "weixin://wxpay/bizpayurl?sign=SIGN&appid=APPID&mch_id=MCHID&product_id=PRODUCTID&time_stamp=TIMESTAMP&nonce_str=NOCESTR";

String result = url.replace("SIGN", sign).

replace("APPID", ConfigUtil.APPID).

replace("MCHID", ConfigUtil.MCH_ID).

replace("PRODUCTID", (String)parameters.get("product_id")).

replace("TIMESTAMP", (String)parameters.get("time_stamp")).

replace("NOCESTR", (String)parameters.get("nonce_str"));

System.out.println("result="+result);

//TODO 将result变成二维码

}

/**

* @author 李欣桦

* @date 2015-1-15上午10:05:46

* @Description:原生支付URL

* @throws Exception

*/

public void execute() throws Exception{

HttpServletRequest request = ServletActionContext.getRequest();

HttpServletResponse response = ServletActionContext.getResponse();

/**

* 获取用户扫描二维码后,微信返回的信息

*/

InputStream inStream = request.getInputStream();

ByteArrayOutputStream outSteam = new ByteArrayOutputStream();

byte[] buffer = new byte[1024];

int len = 0;

while ((len = inStream.read(buffer)) != -1) {

outSteam.write(buffer, 0, len);

}

outSteam.close();

inStream.close();

String result  = new String(outSteam.toByteArray(),"utf-8");

/**

* 获取返回的信息内容中各个参数的值

*/

Map<Object, Object> map = XMLUtil.doXMLParse(result);

SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();

parameters.put("appid", map.get("appid"));

parameters.put("openid", map.get("openid"));

parameters.put("mch_id", map.get("mch_id"));

parameters.put("is_subscribe",map.get("is_subscribe"));

parameters.put("nonce_str", map.get("nonce_str"));

parameters.put("product_id", map.get("product_id"));

String sign = PayCommonUtil.createSign("utf-8", parameters);

/**

* 调用统一接口,返回预付id

*/

SortedMap<Object,Object> para = new TreeMap<Object,Object>();

para.put("appid", ConfigUtil.APPID);

para.put("mch_id", ConfigUtil.MCH_ID);

para.put("nonce_str", PayCommonUtil.CreateNoncestr());

para.put("body", "LEO测试NATIVE支付");

para.put("out_trade_no", "20150106003");//商户订单号要唯一

para.put("total_fee", "1");

para.put("spbill_create_ip",IpAddressUtil.getIpAddr(request));

para.put("notify_url", ConfigUtil.NOTIFY_URL);//支付成功后回调的action,与JSAPI相同

para.put("trade_type", "NATIVE");

para.put("product_id", map.get("product_id"));

String nativeSign = PayCommonUtil.createSign("UTF-8", para);

para.put("sign", nativeSign);

String requestXML = PayCommonUtil.getRequestXml(para);

String nativeResult =CommonUtil.httpsRequest(ConfigUtil.UNIFIED_ORDER_URL, "POST", requestXML);

System.out.println(nativeResult);

Map<Object, Object> resultMap = XMLUtil.doXMLParse(nativeResult);

String returnCode = (String) resultMap.get("return_code");

String resultCode = (String) resultMap.get("result_code");

/**

* 发送信息给微信服务器

*/

SortedMap<Object, Object> toWX  = new TreeMap<Object, Object>();

if(returnCode.equalsIgnoreCase("SUCCESS")&&resultCode.equalsIgnoreCase("SUCCESS")){

String prepayId = (String) resultMap.get("prepay_id");

toWX.put("return_code", "SUCCESS");

toWX.put("return_msg", "");

toWX.put("appid", map.get("appid"));

toWX.put("nonce_str", PayCommonUtil.CreateNoncestr());

toWX.put("prepay_id", prepayId);

String toWXSign ="";

if(map.get("sign").equals(sign)){

toWX.put("result_code", "SUCCESS");

toWXSign = PayCommonUtil.createSign("utf-8", toWX);

}else {//else的部分 暂测试未通过

toWX.put("result_code", "FAIL");

toWX.put("err_code_des", "订单失效");   //result_code为FAIL时,添加该键值对,value值是微信告诉客户的信息

toWXSign = PayCommonUtil.createSign("utf-8", toWX);

}

toWX.put("sign", toWXSign);

response.getWriter().write(PayCommonUtil.getRequestXml(toWX));

System.out.println(PayCommonUtil.getRequestXml(toWX));

}else {

System.out.println("付款失败!");

return ;

}

}

}

Mian方法里是生成二维码给用户扫描,execute方法是我的原声支付URL回调地址。

如果不想写代码生成二维码,可以上http://www.3u.cc/将main方法中打印出来的result在网上上生成二维码。

上述代码中相关工具类的下载地址如下:

http://download.csdn.net/detail/u011160656/8354883

支付成功后,我们需要更新我们的订单状态以及通知微信我们收到付款成功的通知。(调用统一支付接口时传给微信系统的notify_url的作用体现于此)。参考内容以及如何配置notify_url请参考我另外一篇博客,博客地址如下:

http://blog.csdn.net/u011160656/article/details/41759195

时间: 2024-10-19 21:52:21

微信NATIVE静态支付(V3版本)的相关文章

微信NATIVE动态支付(V3版本)

官方相关文档:http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=9_1 其实native动态支付就是调用微信的统一支付接口,在传trade_type时值为NATIVE即可.参考下个类. package com.wingo.action.config; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import com.wingo.

微信支付V3版本的那些事

最近在接入微信支付这块功能,博客园也有很多博友发表了支付的各种吐槽和解决之道,基于那些经验分享之上,我也来说说我的填坑之路. 1:准备工作,首先去申请注册一个公众号——服务号,然后将微信支付功能开通,获得一系列的微信给你分配的商户资料(重要的是商户号),然后在微信支付商户中心设置支付密钥,这个密钥在统一下单和微信签名里面要用到. 2:搭建自己的支付框架项目,开始用自己熟悉的语言开发前台支付页面和后台接口,这里可能因技术栈不同,而会衍生出多种版本,你可以基于PHP,JAVA,C#,NODEJS.

记微信公众平台开发之V3版微信native原生支付功能开发

一.生成商品信息 动态链接支付过程中,是先生成商品交易进行,再来进行支付交易的. 1. 商品信息准备 主要是先定义商品的名称及价格,以及交易号.代码如下. include_once("../WxPayPubHelper/WxPayPubHelper.php"); //使用统一支付接口 $unifiedOrder = new UnifiedOrder_pub(); //设置统一支付接口参数 //设置必填参数 //appid已填,商户无需重复填写 //mch_id已填,商户无需重复填写 /

php微信支付v3版本签名生成

对接微信新版SDKv3版 签名生成规则,微信的官方文档里面说明的还算可以吧,不过个人觉得不太理想- -.  自己调试的时候调试了半天才找了错误原因. https://wechatpay-api.gitbook.io/wechatpay-api-v3 微信v3接口更换了新版签名方式 商户需要使用自身的私钥对API URL.消息体等关键数据的组合进行SHA-256 with RSA签名. 请求的签名信息通过HTTP头Authorization传递,具体说明请见签名生成指南. 没有携带签名或者签名验证

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

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

微信支付开发教程-静态链接Native原生支付开发

微信支付现在分为v2版和v3版,2014年9月10号之前申请的为v2版,之后申请的为v3版.V3版的微信支付没有paySignKey参数.v2的相关介绍请参考方倍工作室的其他文章.本文介绍的为微信支付v3. 一.静态链接二维码生成 静态链接二维码的生成过程中,核心是sign签名.下面介绍sign签名过程. 1. 参数准备 唯一要确定的参数是产品的ID号.其他的是支付参数或者由程序生成.程序生成的部分如下. $this->parameters["appid"] = WxPayCon

(用微信扫的静态链接二维码)微信native支付模式官方提供的demo文件中的几个bug修正

原文:(用微信扫的静态链接二维码)微信native支付模式官方提供的demo文件中的几个bug修正 native支付模式一demo(用微信扫的静态链接二维码)BUG修复,一共4个BUG 1.native_call_qrcode.php这个文件中的代码无法生存native支付的短地址2.WxPayPubHelper.php中某个代码获取不到WxPayConf_pub类定义的常量CURL_TIMEOUT3.WxPayPubHelper.php curl中cURL会话并且异常释放资源4.微信支付长地址

ios微信支付 v3

V2版本和V3版本存在很大的差异. 1. 从成功通过微信支付商户的资料审核返回的邮件开始: 你可以获得这些参数  appid,appSecret,partnerID,    partnerKey(从平台上获得) . 在v3中你获得不到v2所谓的“paySignKey”,--------- 这个把我害残了.当然在v3你真的不需要这个参数了. 2.在做微信支付的时候你要抛弃v2版本的做法,你不需要获得access_token,你不需要用sha1加密.我就是结合v2去做,然后越陷越深. 3. 首先我在

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

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