• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >微信公众号 > 微信扫码支付模式

微信扫码支付模式

作者:匿名 字体:[增加 减小] 来源:互联网

匿名通过本文主要向大家介绍了微信扫码等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

微信扫码支付(模式一)


微信扫码支付遇到的问题

  • 原生支付URL参数错误

  • 回调接口URL有回调,但是接收不到参数

  • 商户后台返回的数据字段结构不合法

  • 获取商户订单信息超时或者商户返回的httpcode非200

解决问题

  • 原生支付URL参数错误
    这个错误一般会出现在获取到二维码URL之后生成二维码微信扫码的时候。如果你出现此类型的问题请检查

1、生成二维码所需参数列表中参数是否有错误(区分大小写)
2、参数中签名sign时候正确 签名算法 签名校验工具


以下是生成二维码URL的代码

/**
 * 
 * @author Javen
 * 2016年5月14日
 * 扫码支付获取二维码URL(模式一)
 */
public String getCodeUrl(){
    String url="weixin://wxpay/bizpayurl?sign=XXXXX&appid=XXXXX&mch_id=XXXXX&product_id=XXXXX&time_stamp=XXXXX&nonce_str=XXXXX";
    String product_id="001";
    String timeStamp=Long.toString(System.currentTimeMillis() / 1000);
    String nonceStr=Long.toString(System.currentTimeMillis());
    Map<String, String> packageParams = new HashMap<String, String>();
    packageParams.put("appid", appid);
    packageParams.put("mch_id", partner);
    packageParams.put("product_id",product_id);
    packageParams.put("time_stamp", timeStamp);
    packageParams.put("nonce_str", nonceStr);
    String packageSign = PaymentKit.createSign(packageParams, paternerKey);
    return StringUtils.replace(url, "XXXXX", packageSign,appid,partner,product_id,timeStamp,nonceStr);
}
  • 回调接口URL有回调,但是接收不到参数

    Enumeration<String> en=getParaNames();

      while (en.hasMoreElements()) {
          Object o= en.nextElement();
          System.out.println(o.toString()+"="+getPara(o.toString()));
      }

以上代码中输出的参数都为NULL

由于官方的文档描述不是很清楚,大家都以为回调请求将带productid和用户的openid等参数是以普通的参数一样,其实这个回调返回的参数是一个XML输入流

HttpServletRequest request = getRequest();
         /**
         * 获取用户扫描二维码后,微信返回的信息
         */
        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");

result结果为

<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wx5e9360a3f46f64cd]]></appid>
<mch_id><![CDATA[1322117501]]></mch_id>
<nonce_str><![CDATA[lr3cCuO2KxMEBHIW]]></nonce_str>
<sign><![CDATA[842C1857EDD009D67519527BCF3AFA4C]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<prepay_id><![CDATA[wx201605151311568e801d50fb0555050106]]></prepay_id>
<trade_type><![CDATA[NATIVE]]></trade_type>
<code_url>![CDATA[weixin://wxpay/bizpayurl?pr=Gj3ZF2b]]</code_url>
</xml>

如果返回的 return_code result_code 不为SUCCESS 而回调的接口没有返回任何数据或者返回的数据不合法就会出现以下错误

  • 商户后台返回的数据字段结构不合法(返回的数据包格式不正确)

  • 获取商户订单信息超时或者商户返回的httpcode非200(没有返回的数据包)

如果以上都没有问题,就剩下最后一个步骤了 商户后台系统将prepay_id返回给微信支付系统 以下是详细的代码

/**
 * @author Javen
 * 2016年5月14日
 * 扫码支付回调(模式一)
 */

public void wxpay(){
try {
HttpServletRequest request = getRequest();
/**

         * 获取用户扫描二维码后,微信返回的信息
         */
        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");

        System.out.println("callback>>>>"+result);
        /**
         * 获取返回的信息内容中各个参数的值
         */
        Map<String, String> map = PaymentKit.xmlToMap(result);
        for (String key : map.keySet()) {
               System.out.println("key= "+ key + " and value= " + map.get(key));
        }

        String appid=map.get("appid");
        String openid = map.get("openid");
        String mch_id = map.get("mch_id");
        String is_subscribe = map.get("is_subscribe");
        String nonce_str = map.get("nonce_str");
        String product_id = map.get("product_id");
        String sign = map.get("sign");
        Map<String, String> packageParams = new HashMap<String, String>();
        packageParams.put("appid", appid);
        packageParams.put("openid", openid);
        packageParams.put("mch_id",mch_id);
        packageParams.put("is_subscribe",is_subscribe);
        packageParams.put("nonce_str",nonce_str);
        packageParams.put("product_id", product_id);

        String packageSign = PaymentKit.createSign(packageParams, paternerKey);
        // 统一下单文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1

        Map<String, String> params = new HashMap<String, String>();
        params.put("appid", appid);
        params.put("mch_id", mch_id);
        params.put("body", "测试扫码支付");
        String out_trade_no=Long.toString(System.currentTimeMillis());
        params.put("out_trade_no", out_trade_no);
        int price=((int)(Float.valueOf(10)*100));
        params.put("total_fee", price+"");
        params.put("attach", out_trade_no);

        String ip = IpKit.getRealIp(getRequest());
        if (StrKit.isBlank(ip)) {
            ip = "127.0.0.1";
        }

        params.put("spbill_create_ip", ip);
        params.put("trade_type", TradeType.NATIVE.name());
        params.put("nonce_str", System.currentTimeMillis() / 1000 + "");
        params.put("notify_url", notify_url);
        params.put("openid", openid);

        String paysign = PaymentKit.createSign(params, paternerKey);
        params.put("sign", paysign);

        String xmlResult = PaymentApi.pushOrder(params);

        System.out.println("prepay_xml>>>"+xmlResult);

        /**
         * 发送信息给微信服务器
         */
        Map<String, String> payResult = PaymentKit.xmlToMap(xmlResult);

        String return_code = payResult.get("return_code");
        String result_code = payResult.get("result_code");

        if (StrKit.notBlank(return_code) && StrKit.notBlank(result_code) && return_code.equalsIgnoreCase("SUCCESS")&&result_code.equalsIgnoreCase("SUCCESS&



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 微信开发支付功能实例展示
  • 微信公众号开发客服接口实例代码
  • C#开发微信门户及应用微信企业号的菜单管理
  • 微信通过某个事件推送消息
  • 有关微信朋友圈的文章推荐10篇
  • 微信公众账号开发者认证:uwsgi结合web.py的步骤详解
  • java微信开发之上传下载多媒体文件
  • C#开发微信门户及应用-微信企业号的消息发送(文本、图片、文件、语音、视频、图文消息等)
  • thinkphp项目如何自定义微信分享描述内容
  • 微信公众平台消息接口开发从Hello2BizUser文本到subscribe事件

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#微信开发之接收 / 返回文本消息原理与实现方法
    • 分享一个Android实现微信自动抢红包的代码实例
    • 微信小程序实现发送模板消息
    • 详解android微信支付实例代码
    • 微信开发入门(六)用户数据解密
    • 教你libco是如何支撑巨大数据信息量的
    • 微信公众平台消息接口开发在线点歌/在线音乐
    • 使用require.js+vue开发微信上传图片组件方法
    • 做一个微信H5页面的过程详解
    • 利用node.js开发微信公众平台教程

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有