一、准备资料
- 微信公众号服务号
- 商户平台账号开通了微信支付
- 公网域名(或内网穿透)
- 服务器(或内网穿透)
- 商户APPID
- 商户API密钥APPSECRET
- 商户号MCHID
二、公众号和商户平台配置
1、公众号配置
公众号登录后 -> 公众号设置 -> 功能设置:JS接口安全域名需要填写准备使用微信支付的域名
添加或修改
这里有4点要注意的:
1.需要填写域名或路径,不支持ip地址,端口号,短链域名,一般直接用域名就行了
2.域名需要经过备案
3.将其中下载的txt文件放在服务器域名映射的根目录,假如域名是:abc.de.com,那就要确保:abc.de.com/MP_verify_nT4jEtfHhaE7IceO.txt能访问到该txt文件。
公众号的设置就完成了
2、商户平台配置
首先进入:账户中心 -> 操作证书,在电脑安装了证书之后进入:API安全
- 下载证书,这个证书是用于退款等操作的
- API密钥设置,api密钥设置不能特意设置,得随意设置,一般设置有意义的字符串都不能支付,需要去生成随机32位随机码,地址:随机码
接着继续进入:产品中心 -> 开发配置 -> 支付配置 -> 公众号支付 -> 支付授权目录
这里需要注意的是:
授权目录一定要填写到调起支付页面的上一级目录,加入支付页是:abc.de.com/demo/pay.jsp,那么需要填写:abc.de.com/demo/
商户平台的配置也完成了,接下来就是编码了
三、编写demo
先定义一部分常量:
WxConst.java
package com.demo.common;
/**
* @author xyd
* @version V1.0
* @Package com.demo.common
* @Description:
* @date 2018/8/8 10:45
*/
public class WxConst {
/**
* acesstoken
*/
public static String ACCESSTOKEN = "";
/**
* 公众号appId
*/
public static String APPID = "";
/**
* 公众号secret
*/
public static String SECRET = "";
/**
* 公众号jsapi ticket
*/
public static String JSAPITICKET = "";
/**
* 签名类型
*/
public enum SignType {
MD5, HMACSHA256
}
/**
* 商户支付密码
*/
public static String PAYAPISECRET = "";
/**
* 商户号
*/
public static String MCHID = "";
/**
* 商户密钥
*/
public static String MCHKEY = "";
/**
* 签名字段名称
*/
public static final String FIELD_SIGN = "sign";
/**
* 服务商退款证书路径
*/
public static String CERTIFICATE_PATH = "/usr/local/cert/apiclient_cert.p12";
/**
* 下单地址
*/
public static final String WXPAY_UNIFIEDORDER_GATEWAY = "https://api.mch.weixin.qq.com/pay/unifiedorder";
/**
* 退款地址
*/
public static final String WXPAY_REFUND_GATEWAY = "https://api.mch.weixin.qq.com/secapi/pay/refund";
/**
* 下单回调地址
*/
public static final String ORDER_NOTIFYURL = "";
/**
* 回复微信的消息
*/
public static final String NOTIFY_RESPONSE_BODY = "<xml>\n" +
" <return_code><![CDATA[SUCCESS]]></return_code>\n" +
" <return_msg><![CDATA[OK]]></return_msg>\n" +
"</xml>";
/**
* 失败
*/
public static final String FAIL = "FAIL";
/**
* 成功
*/
public static final String SUCCESS = "SUCCESS";
}
1、动态获取ACCESSTOKEN和JSAPITICKET
参考微信支付开发文档可知,需要先获取accesstoken和jsapiticket
JS-SDK文档:JS-SDK
微信统一下单文档:统一下单
首先注入依赖:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo</groupId>
<artifactId>wechatpaydemo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>wechatpaydemo Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<!-- spring版本号 -->
<spring.version>4.3.3.RELEASE</spring.version>
<!-- mybatis版本号 -->
<mybatis.version>3.3.1</mybatis.version>
<!-- log4j日志文件管理包版本 -->
<slf4j.version>1.7.7</slf4j.version>
<log4j.version>1.2.17</log4j.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!-- spring核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 日志文件管理包 -->
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- json包-->
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.5.0</version>
</dependency>