微信扫码支付(4):统一下单

1.下载微信JAVA SDK

地址:https://pay.weixin.qq.com/wiki/doc/api/download/WxPayAPI_JAVA.zip

2.配置文件及代码

#####################支付宝-开始#####################
#应用ID
com.test.zconfig[APP_ID]=******
#支付宝网关,含dev是测试网关,正式地址:https://openapi.alipay.com/gateway.do
com.test.zconfig[OPEN_API_DOMAIN]=https://openapi.alipaydev.com/gateway.do
#商户私钥
com.test.zconfig[PRIVATE_KEY]=******
#支付宝公钥
com.test.zconfig[ALIPAY_PUBLIC_KEY]=******
#订单过期时间,m=分钟
com.test.zconfig[timeout_express]=5m
##########驾驶模拟考试##############
#ID前缀
com.test.zjsmnks[prefix]=zfb-
#标题
com.test.zjsmnks[subject]=支付宝支付测试
#用户付款后,支付宝回调通知URL
com.test.zjsmnks[notify_url]=http://localhost:8080/api/zfb/order/notice/
#####################支付宝-结束#####################

#####################微信-开始#####################
#应用ID
com.test.wconfig[APP_ID]=******
#商户ID
com.test.wconfig[MCH_ID]=******
#证书路径
com.test.wconfig[CERT_PATH]=/pay/wx/apiclient_cert.p12
#API密钥
com.test.wconfig[API_KEY]=******
#订单过期时间,m=分钟
com.test.wconfig[timeout_express]=5m
##########驾驶模拟考试##############
#ID前缀
com.test.wjsmnks[prefix]=wx-
#标题
com.test.wjsmnks[subject]=微信支付测试
#用户付款后,微信回调通知URL
com.test.wjsmnks[notify_url]=http://localhost:8080/api/wx/order/notice/
#####################微信-结束#####################

其中apiclient_cert.p12就是在第2步证书生成时产生的。

#API密钥 填写沙箱验签密钥(第3步),正式环境时一定要改成真实的API密钥(第2步)。

3.配置文件代码 PropertiesPay

import java.util.LinkedHashMap;
import java.util.Map;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

/**
 *
 * 类描述: 项目主配置文件
 *
 */
@Component
@ConfigurationProperties(prefix = "com.test")
@PropertySource(value = "classpath:/config/pay.properties", encoding = "utf-8")
public class PropertiesPay {

  // 支付宝
  private LinkedHashMap<String, String> zconfig = new LinkedHashMap<>();
  private LinkedHashMap<String, String> zjsmnks = new LinkedHashMap<>();
  // 微信
  private LinkedHashMap<String, String> wconfig = new LinkedHashMap<>();
  private LinkedHashMap<String, String> wjsmnks = new LinkedHashMap<>();

  public final Map<String, String> getZconfig() {
    return zconfig;
  }

  public final void setZconfig(Map<String, String> zconfig) {
    this.zconfig = (LinkedHashMap<String, String>) zconfig;
  }

  public final Map<String, String> getZjsmnks() {
    return zjsmnks;
  }

  public final void setZjsmnks(Map<String, String> jsmnks) {
    this.zjsmnks = (LinkedHashMap<String, String>) jsmnks;
  }

  public final Map<String, String> getWconfig() {
    return wconfig;
  }

  public final void setWconfig(Map<String, String> wconfig) {
    this.wconfig = (LinkedHashMap<String, String>) wconfig;
  }

  public final Map<String, String> getWjsmnks() {
    return wjsmnks;
  }

  public final void setWjsmnks(Map<String, String> wjsmnks) {
    this.wjsmnks = (LinkedHashMap<String, String>) wjsmnks;
  }

}

4.重写WXPayConfig

package com.github.wxpay.sdk;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.csget.properties.PropertiesPay;
import com.csget.service.impl.queue.ServiceImplQueueLog;

public class MyWXConfig extends WXPayConfig {

  private PropertiesPay propertiesPay;

  private Logger log = LoggerFactory.getLogger(ServiceImplQueueLog.class);

  private byte[] certData;

  public MyWXConfig(PropertiesPay propertiesPay) throws Exception {
    this.propertiesPay = propertiesPay;
    try (InputStream certStream = MyWXConfig.class.getResourceAsStream(propertiesPay.getWconfig().get("CERT_PATH"))) {
      this.certData = new byte[certStream.available()];
      int intRead = certStream.read(this.certData);
      log.debug("读取字节数:{}", intRead);
    }
  }

  @Override
  public String getAppID() {
    return propertiesPay.getWconfig().get("APP_ID");
  }

  @Override
  public String getMchID() {
    return propertiesPay.getWconfig().get("MCH_ID");
  }

  @Override
  public String getKey() {
    return propertiesPay.getWconfig().get("API_KEY");
  }

  @Override
  public InputStream getCertStream() {
    return new ByteArrayInputStream(this.certData);
  }

  @Override
  public IWXPayDomain getWXPayDomain() { // 这个方法需要这样实现, 否则无法正常初始化WXPay
    return new IWXPayDomain() {
      @Override
      public void report(String domain, long elapsedTimeMillis, Exception ex) {
        // do nothing
      }

      @Override
      public DomainInfo getDomain(WXPayConfig config) {
        return new IWXPayDomain.DomainInfo(WXPayConstants.DOMAIN_API, true);
      }
    };
  }
}


5.测试代码

import java.util.HashMap;
import java.util.Map;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import com.csget.properties.PropertiesPay;
import com.github.wxpay.sdk.MyWXConfig;
import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayUtil;

import net.common.util.tool.common.UUIDUtil;

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestWXPay {

  @Autowired
  private PropertiesPay propertiesPay;

  @Test
  public void pay() throws Exception {
    // 使用沙箱测试
    MyWXConfig myWXConfig = new MyWXConfig(propertiesPay);
    // 第3个参数决定是否使用沙箱环境,false=正式环境,如果API_KEY为沙箱密钥,返回结果也会报错。
    WXPay wxpay = new WXPay(myWXConfig, false, false);
    Map<String, String> paramMap = new HashMap<String, String>();
    paramMap.put("trade_type", "NATIVE"); // 交易类型
    paramMap.put("spbill_create_ip", "127.0.0.1"); // 本机的Ip
    paramMap.put("product_id", "1111"); // 商户根据自己业务传递的参数 必填
    paramMap.put("body", "微信支付测试"); // 描述
    paramMap.put("out_trade_no", UUIDUtil.getUUID()); // 商户 后台的贸易单号
    paramMap.put("total_fee", "1"); // 金额必须为整数 单位为分
    paramMap.put("fee_type", "CNY"); // 金额必须为整数 单位为分
    paramMap.put("notify_url", "http://127.0.0.1/wx_pay_notify"); //支付成功后,回调地址
    paramMap.put("appid", myWXConfig.getAppID()); // 微信公众号开发ID
    paramMap.put("mch_id", myWXConfig.getMchID()); // 商户号
    paramMap.put("nonce_str", WXPayUtil.generateNonceStr()); // 随机数
    paramMap.put("sign", WXPayUtil.generateSignature(paramMap, myWXConfig.getKey()));// 根据微信签名规则,生成签名
    try {
      Map<String, String> resp = wxpay.unifiedOrder(paramMap);
      System.out.println("返回结果:" + resp);
    } catch (Exception e) {
      e.printStackTrace();
    }

  }

}

返回结果:

{nonce_str=xkrWRGMW4d5Sh0Tv, code_url=weixin://wxpay/bizpayurl?pr=08rYhA9, appid=wxa45774e8ec797baa, sign=F4496EFC75F2FAE6D6C24DD50FB82F4A35F3734E7DA69AE82A0BD76636035162, trade_type=NATIVE, return_msg=OK, result_code=SUCCESS, mch_id=1532346751, return_code=SUCCESS, prepay_id=wx2323101167496591657b36d51646619704}

获得code_url的值生成二维码。

用微信扫码即可付款,如果是沙箱环境,生成的二维码扫码后会告知已经过期,这是正常的,改成正式环境没有这个问题。


至此微信扫码付款完结,其余接口应该可以同样打通,不再赘叙!


原文地址:https://www.cnblogs.com/huiy/p/10759688.html

时间: 2024-10-08 18:26:21

微信扫码支付(4):统一下单的相关文章

Net MVC微信扫码支付

微信扫码支付+Asp.Net MVC 这里的扫码支付指的是PC网站上面使用微信支付,也就是官方的模式二,网站是Asp.net MVC,整理如下. 一.准备工作 使用的微信API中的统一下单方法,关键的参数是‘公众账号ID(appid)’,‘商户号(mch_id)’和’商户支付密钥(KEY)‘,所以首先要有一个审核过的公众号,并开通支付功能,然后申请商户,通过审核后得到商户号,也就是商户平台的登录名.商户支付密钥是用来签名的,确保url不被篡改.进入商户平台后在API安全中设置,是一个32位的字符

微信扫码支付(模式一)

项目开源地址:http://git.oschina.net/javen205/weixin_guide 微信扫码支付(模式一)你有测试成功吗?如果你看到了这篇文章,我想你是在测试中遇到问题了.OK 那现在我们来看看微信扫码支付中的坑. 原生支付URL参数错误 回调接口URL有回调,但是接收不到参数 商户后台返回的数据字段结构不合法 获取商户订单信息超时或者商户返回的httpcode非200 官方文档地址:https://pay.weixin.qq.com/wiki/doc/api/native.

.NET MVC结构框架下的微信扫码支付模式二 API接口开发测试

直接上干货 ,我们的宗旨就是为人民服务.授人以鱼不如授人以渔.不吹毛求疵.不浮夸.不虚伪.不忽悠.一切都是为了社会共同进步,繁荣昌盛,小程序猿.大程序猿.老程序猿还是嫩程序猿,希望这个社会不要太急功近利 ,希望每个IT行业的BOSS要有良知,程序猿的青春年华都是无私默默奉献,都是拿命拼出来了现在的成就,如果卸磨杀驴,如果逼良为娼,请MM你的良心对得起你爹妈吗,你也有家,你也有小孩,你也有父母的. 在这里致敬程序猿, 致敬我们的攻城狮,致敬我们最可爱的人! 珍惜生命,换种活法也是依然精彩. Vie

java微信扫码支付(模式二)

微信扫码支付——模式二 代码: PayCommonUtil.java  微信支付常用方法 1 import java.text.SimpleDateFormat; 2 import java.util.Date; 3 import java.util.Iterator; 4 import java.util.Map; 5 import java.util.Set; 6 import java.util.SortedMap; 7 8 public class PayCommonUtil 9 { 1

微信扫码支付功能(1)---通过谷歌二维码工具生成付款码

生成付款二维码 一.微信网站扫码支付介绍 1.扫码支付文档 微信开发官方文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5 有关微信支付的流程图微信官方已经说的很清楚了,这里也无需其它解释.这边采用微信支付扫码模式二(不依赖商户平台设置回调url),所以在生成二维码之前 要先调用微信统一下单支付接口,获得code_url,再通过谷歌二维码工具将code_url生成二维码图片. 2.名称理解 在微信扫码支付功能开发之前,

微信扫码支付(基于java ssm)

//微信扫码支付主要为返回预生成交易链接,所以需要生成二维码,前端可使用jquery.QRcode.js进行生成//主要的Controllerpackage Controllers; import Entity.UnifiedOrderRequest;import Entity.UnifiedOrderRespose;import com.alibaba.fastjson.JSONObject;import com.thoughtworks.xstream.XStream;import com.

ThinkPHP微信扫码支付接口

最近折腾微信扫码支付,看了微信官方文档,找了很多网页,发现和文档/demo不匹配,现在自己算是弄出来了(文件名称有所更改),贴出来分享一下 一.将有用的官方lib文件和使用的相关文件放置到vendor当中 二.调用同一支付接口 WechatController //调用同一支付接口public function native($v_oid='',$v_amount=''){ ini_set('date.timezone','Asia/Shanghai'); error_reporting(E_E

微信开发笔记:微信扫码支付详解

作为一个PC端的在线购物类网站,具备微信支付的功能自然是必须要有的,那么我们就来详细的看一下微信支付平台提供的微信扫码支付的使用流程: 首先你必须要有一个完成认证的服务号,申请开通微信支付功能,我们可以获得appid 和mch_id (也称为partnerid),之后就会是一个向微信支付平台提交一个支付请求来换取一个支付链接的过程: class wxpay{ function __construct(){ $this->wxpay(); } function wxpay(){ } /** * 生

C#微信扫码支付,回调页面

[C#]C# 微信扫码支付 回调页面 C# 微信扫码支付 回调页面 .NET版 微信扫码支付,官方推荐使用[模式二]一.微信扫码支付模式一:1.回调页面:官方demo中example文件下的NativeNotifyPage.aspx2.微信回调地址:http://域名/目录/NativeNotifyPage.aspx是在公众账号平台里面设置的,如下图 二.微信扫码支付模式二:1.回调页面:官方demo中example文件下的ResultNotifyPage.aspx2.微信回调地址:http:/

JAVA微信扫码支付模式二功能实现以及回调

一.准备工作 首先吐槽一下微信关于支付这块,本身支持的支付模式就好几种,但是官方文档特别零散,连像样的JAVA相关的demo也没几个.本人之前没有搞过微信支付,一开始真是被它搞晕,折腾两天终于调通了,特此写下来,以享后人吧! 关于准备工作,就"微信扫码支付模式二"官方文档地址在这 https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1 可以先看看,实际上需要准备的东西有以下几个: 其中APP_ID和APP_SECRET