微信JSAPI支付(一)统一下单

开发准备

参考文档 JSAPI支付开发文档

支付方式

目前微信主流的支付方式有以下6种

方式 说明
付款码支付 付款码支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式。主要应用线下面对面收银的场景。
Native支付 Native支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景。
JSAPI支付 JSAPI支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。
APP支付 APP支付又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式。
H5支付 H5支付主要是在手机、ipad等移动设备中通过浏览器来唤起微信支付的支付产品。
小程序支付 小程序支付是专门被定义使用在小程序中的支付产品。目前在小程序中能且只能使用小程序支付的方式来唤起微信支付。

因为前面做过关于公众号的文章,因此这里主要介绍JSAPI支付,后面的开发等也围绕于此。

JSAPI应用场景有:

  • 用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付
  • 用户的好友在朋友圈、聊天窗口等分享商家页面连接,用户点击链接打开商家页面,完成支付
  • 将商户页面转换成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付

核心名词

不同于微信公众号的测试开发,可以使用内网穿透,和普通的测试账号等。微信支付要求开发者,必须要有一个已通过验证的真实商户号,且该商户号开通支付功能,以及该商户下有真实的公众号等。

  1. 【微信商户平台】
    微信商户平台是微信支付相关的商户功能集合,包括参数配置、支付数据查询与统计、在线退款、代金券或立减优惠运营等功能
    平台入口:http://pay.weixin.qq.com

  2. 【微信公众平台】
    微信公众平台是微信公众账号申请入口和管理后台。商户可以在公众平台提交基本资料、业务资料、财务资料申请开通微信支付功能。
    平台入口:http://mp.weixin.qq.com

  3. 【微信支付系统】
    微信支付系统是指完成微信支付流程中涉及的API接口、后台业务处理系统、账务系统、回调通知等系统的总称。

  4. 【商户证书】
    商户证书是微信提供的二进制文件,商户系统发起与微信支付后台服务器通信请求的时候,作为微信支付后台识别商户真实身份的凭据。

  5. 【商户后台系统】
    商户后台系统是商户后台处理业务系统的总称,例如:商户网站、收银系统、进销存系统、发货系统、客服系统等,一般关联开发者自己的数据库。

  6. 【签名】
    商户后台和微信支付后台根据相同的密钥和算法生成一个结果,用于校验双方身份合法性。签名的算法由微信支付制定并公开,常用的签名方式有:MD5、SHA1、SHA256、HMAC等。

  7. 【支付密码】
    支付密码是用户开通微信支付时单独设置的密码,用于确认支付完成交易授权。该密码与微信登录密码不同。

  8. 【Openid】
    用户在公众号内的身份标识,不同公众号拥有不同的openid。商户后台系统通过登录授权、支付通知、查询订单等API可获取到用户的openid。主要用途是判断同一个用户,对用户发送客服消息、模版消息等。

申请的核心账户参数:

账户参数说明

邮件中参数 API参数名 详细说明
APPID appid appid是微信公众账号或开放平台APP的唯一标识,在公众平台申请公众账号或者在开放平台申请APP账号后,微信会自动分配对应的appid,用于标识该应用。可在微信公众平台–>开发–>基本配置里面查看,商户的微信支付审核通过邮件中也会包含该字段值。
微信支付商户号 mch_id 商户申请微信支付后,由微信支付分配的商户收款账号。
API密钥 key 交易过程生成签名的密钥,仅保留在商户系统和微信支付后台,不会在网络中传播。商户妥善保管该Key,切勿在网络中传输,不能在其他客户端中存储,保证key不会被泄漏。商户可根据邮件提示登录微信商户平台进行设置。也可按以下路径设置:微信商户平台(pay.weixin.qq.com)–>账户中心–>账户设置–>API安全–>密钥设置
Appsecret secret AppSecret是APPID对应的接口密码,用于获取接口调用凭证access_token时使用。在微信支付中,先通过OAuth2.0接口获取用户openid,此openid用于微信内网页支付模式下单接口使用。可登录公众平台–>微信支付,获取AppSecret(需成为开发者且帐号没有异常状态)。

协议规则

商户接入微信支付,调用API必须遵循以下规则:

传输方式 为保证交易安全性,采用HTTPS传输
提交方式 采用POST方法提交
数据格式 提交和返回数据都为XML格式,根节点名为xml
字符编码 统一采用UTF-8字符编码
签名算法 MD5/HMAC-SHA256
签名要求 请求和接收数据均需要校验签名,详细方法请参考安全规范-签名算法
证书要求 调用申请退款、撤销订单、红包接口等需要商户api证书,各api接口文档均有说明。
判断逻辑 先判断协议字段返回,再判断业务返回,最后判断交易状态

开发中代码配置的参数(实际开发中建议直接在属性文件中配置,便于环境切换)

// 公众号、小程序appid
public static String APP_ID = "xxxxxxxxx"; 
// AppSecret
public static String SECRET = "xxxxxxxxx";
// 商户号
public static final String MCH_ID = "xxxxxxxxx";
// API密钥
public static final String API_KEY = "xxxxxxxxx";
// 网页授权域名,JSAPI支付授权目录,JS接口安全域名
public static final String AUTH_URL = "xxxxxxxxx";

以上参数不便公开。如果公司有现成的支付账户最好,没有的话恐怕只能在某宝租用一下了,但没有这些不影响前期的业务开发。

业务梳理

业务流程时序图

对于开发者来说,发起支付的过程中,

后端:主要调用了JSAPI支付中的三个接口:【统一下单API】、【支付结果通知API】、【查询订单API

前端:

前端微信内H5调起支付,提供用户触发微信支付的button和JSON数据传输。

开始开发

项目搭建

一、采用SpringBoot+Thymeleaf结构,参考微信公众号快速开发(二)项目搭建与被动回复

二、引入官方SDK工具包

阅读文档后发现,对于xml解析,加密算法等其实都时常用的方法,微信为我们直接提供了常用工具类方法的半成品,注意,这些只能是半成品,使用时需要做适当的更改。

链接:SDK与DEMO下载,选择JAVA版本下载后解压即可

代码开发

公众号配置

一、将公众号和商户的信息注入到Bean中

@Component
public class WXPayConfigExtend extends WXPayConfig {
   

    private byte[] certData;

    private WXPayConfigExtend() throws Exception {
   
//        String certPath = WXPayConstants.APICLIENT_CERT;
//        File file = new File(certPath);
//        InputStream certStream = new FileInputStream(file);
//        this.certData = new byte[(int) file.length()];
//        certStream.read(this.certData);
//        certStream.close();
    }

    @Override
    public String getAppID() {
   
        return WXPayConstants.APP_ID;
    }
    @Override
    public String getMchID() {
   
        return WXPayConstants.MCH_ID;
    }
    @Override
    public String getKey() {
   
        return WXPayConstants.API_KEY;
    }
    @Override
    public InputStream getCertStream() {
   
        ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);
        return certBis;
    }
    @Override
    public int getHttpConnectTimeoutMs() {
   
        return 2000;
    }
    @Override
    public int getHttpReadTimeoutMs() {
   
        return 10000;
    }
    @Override
    public IWXPayDomain getWXPayDomain() {
   
        return WXPayDomainSimpleImpl.instance();
    }
    public String getPrimaryDomain() {
   
        return "api.mch.weixin.qq.com";
    }
    public String getAlternateDomain() {
   
        return "api2.mch.weixin.qq.com";
    }
    @Override
    public int getReportWorkerNum() {
   
        return 1;
    }
    @Override
    public int getReportBatchSize() {
   
        return 2;
    }
}
获取openid

需页面提供网页授权,以获取openid,关于微信网页授权可参考:微信公众号快速开发(四)微信网页授权

页面:

页面这里直接设计了一个可以发起预支付的按钮的静态页面:templates/preOrder.html

里面包含了跳转到后端支付接口的表单:

<form name=wexinpayment action='http://chety.mynatapp.cc/api/v1/wechat1/placeOrder' method=post target="_blank">
    ...

Thymeleaf下页面转发的控制器:

@Controller
@RequestMapping("/api/v1/wechat1")
pub
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 微信JSAPI支付是一种使用微信内置浏览器或微信客户端内的网页进行支付的方式。流程如下: 1. 用户在商户的网站或应用内点击支付按钮,触发支付请求。 2. 商户服务器收到支付请求后,向微信支付服务器发起下单请求,并将支付信息传递给微信支付服务器。 3. 微信支付服务器收到下单请求后,会根据商户提交的信息生成支付二维码或支付链接。 4. 商户服务器收到微信支付服务器的响应后,将支付二维码或支付链接发送给用户浏览器。 5. 用户浏览器打开支付二维码或支付链接,跳转到微信内置浏览器或微信客户端进行支付。 6. 用户在微信内置浏览器或微信客户端内输入支付密码或通过其他认证方式进行支付。 7. 微信支付服务器收到用户的支付信息后,会向商户服务器发送支付通知。 8. 商户服务器收到支付通知后,会对订单进行处理,并向用户 ### 回答2: 微信JSAPI支付是一种在微信公众号内进行支付的流程。具体流程如下: 1. 用户在微信公众号内选择商品并点击支付按钮。 2. 公众号服务器向微信服务器发送统一下单接口的请求,包含商品信息、支付金额等。 3. 微信服务器返回预支付交易会话标识prepay_id给公众号服务器。 4. 公众号服务器将prepay_id和其他必要参数进行签名,生成支付配置。 5. 公众号将签名后的支付配置返回给前端页面。 6. 前端使用微信JS-SDK调起支付窗口,调用微信支付接口,并传入签名后的支付配置。 7. 微信客户端收到支付请求后,弹出支付窗口,展示商品信息和支付金额。 8. 用户确认支付金额,并输入支付密码进行支付。 9. 微信客户端支付成功后,会返回支付结果给公众号服务器。 10. 公众号服务器接收到支付结果后进行校验,若校验通过,表示支付成功。 11. 公众号服务器更新订单状态,并向用户展示支付成功页面。 以上就是微信JSAPI支付的整个流程。通过将用户在微信公众号内的支付请求发送给微信服务器,再由微信客户端完成支付,最后由公众号服务器校验支付结果,实现了在微信公众号内进行支付的功能。 ### 回答3: 微信JSAPI支付流程是指用户在微信公众号内进行支付的一种支付方式。其流程如下: 1. 用户在微信公众号内选择商品或服务,并点击支付按钮。 2. 公众号向微信后台发起支付请求,并返回一个预支付交易会话标识(prepay_id)。 3. 公众号将prepay_id传递给前端页面,前端页面使用prepay_id生成签名,例如通过微信的SDK引入的js文件。 4. 前端页面将生成的签名和其他必要的支付参数传递给微信支付接口,发起支付请求。 5. 微信支付接口验证签名和参数合法性后,返回支付结果给前端页面。 6. 前端页面接收到支付结果后,可以根据结果进行相应的处理,例如弹出支付成功提示或跳转到支付成功页面。 7. 微信支付接口向商户服务器发送支付通知。 8. 商户服务器收到支付通知后,校验通知的合法性,并进行相应的处理,例如更新订单状态或给用户发放购买的商品或服务。 9. 商户服务器向微信支付接口返回处理结果,以确认已经接收到支付通知。 10. 微信支付接口收到商户服务器的确认后,停止向商户服务器发送支付通知。 总结起来,微信JSAPI支付流程主要包括用户在公众号内选择支付、公众号发起支付请求、前端页面生成签名并发起支付请求、微信支付接口返回支付结果、商户服务器处理支付通知等环节。通过这个流程,用户可以方便地在微信公众号内进行支付
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值