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

2024-05-31 17:18

本文主要是介绍微信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

这篇关于微信NATIVE静态支付(V3版本)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1018551

相关文章

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

Thymeleaf:生成静态文件及异常处理java.lang.NoClassDefFoundError: ognl/PropertyAccessor

我们需要引入包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>sp

uniapp设置微信小程序的交互反馈

链接:uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗: title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon:'error'是设置我们失败的logo 设置的文字上限是7个文字,如果需要设置的提示文字过长就需要设置icon并给

PostgreSQL中的多版本并发控制(MVCC)深入解析

引言 PostgreSQL作为一款强大的开源关系数据库管理系统,以其高性能、高可靠性和丰富的功能特性而广受欢迎。在并发控制方面,PostgreSQL采用了多版本并发控制(MVCC)机制,该机制为数据库提供了高效的数据访问和更新能力,同时保证了数据的一致性和隔离性。本文将深入解析PostgreSQL中的MVCC功能,探讨其工作原理、使用场景,并通过具体SQL示例来展示其在实际应用中的表现。 一、

InnoDB的多版本一致性读的实现

InnoDB是支持MVCC多版本一致性读的,因此和其他实现了MVCC的系统如Oracle,PostgreSQL一样,读不会阻塞写,写也不会阻塞读。虽然同样是MVCC,各家的实现是不太一样的。Oracle通过在block头部的事务列表,和记录中的锁标志位,加上回滚段,个人认为实现上是最优雅的方式。 而PostgreSQL则更是将多个版本的数据都放在表中,而没有单独的回滚段,导致的一个结果是回滚非

JeecgBoot 升级springboot版本到2.6.0

1. 环境描述 Jeecgboot 3.0,他所依赖的springboot版本为2.3.5Release,将springboot版本升级为2.6.0。过程全纪录,从2开始描述。 2. 修改springboot版本号 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-pare

C++/《C++为什么要有静态成员函数》

摘要        本文说明了什么是静态成员变量,什么是静态成员函数的概念,讨论了访问私有静态成员变量的三个方法。得出用静态成员函数访问静态私有成员变量是最佳方法即回答了“C++为什么要有静态成员函数“的问题。 类的静态成员 我们可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。静态成员在类的所有对象中是

c++的静态变化!

静态成员   对于非静态成员,一个类的每个对象都自己存有一个副本,每个对象根据自己拥有的非静态的数据成员来区别于其他对象。而静态成员则解决了同一个类的多个对象之间数据和函数的共享问题。   静态数据成员   静态数据成员的作用是:实现同一类的不同对象之间的数据共享。   #include<IOSTREAM>   using namespace std;   class Po