微信开放平台(分享)

微信支付 - 中国领先的第三方支付平台 | 微信支付提供安全快捷的支付方式

微信公众平台(公众号,订阅号)

先区分以上三个微信官网概念:分别实现什么功能

小程序支付官方文档:微信支付-开发者文档

前期准备工作

1.注册小程序

2.注册微信支付账号(由于需要营业执照等信息,暂无法注册)

一,模块架构

分为两部分 1.小程序(公众号) 2.微信支付(中)

二,关键概念

1.首先注册成为商户

2.小程序APPID 登录小程序-开发-开发管理-开发设置

3.商家的商户ID,就是注册的用户名

4.商家的API私钥,就是下面设置的秘钥

5.openid,这是很重要参数,下单需要。对接不同载体获取方式不同。

openid是微信用户在appid下的唯一用户标识(appid不同,则获取到的openid就不同),可用于永久标记一个用户。openid获取方式请参考以下文档小程序获取openid、公众号获取openid、APP获取openid

且前提要有code,这个code是前端传入。

三,接入准备

微信支付-开发者文档

  • 1.选择接入模式
  • 2.参数申请(注册小程序获取appId和mchid)
  • 3. 配置API key(商家API私钥用于签名,构建客户端)
  • 4. 下载并配置商户证书(下载生成证书,用于签名,构建客户端)
  • 5. 小程序支付配置应用

四,签约产品

即购买什么支付方法,二维码,还是JSAPI等

产品中心 - 微信支付商户平台

五,设置回调地址

支付完成之后,程序服务端接收微信支付成功的回调信息,之后进行其他业务逻辑处理,比如更新订单状态

六,绑定微信支付与小程序

七,签名

类似token,调用接口传参。注意签名并不需要apiV3密钥,构建客户端需要。

微信支付-普通下单开发者文档

微信支付-开发者文档

八,构建客户端

GitHub - wechatpay-apiv3/wechatpay-apache-httpclient: 微信支付 APIv3 Apache HttpClient装饰器(decorator)

重要概念:

/*** merchantId商户号。* merchantSerialNumber商户API证书的证书序列号。* merchantPrivateKey商户API私钥,如何加载商户API私钥请看常见问题。* wechatpayCertificates微信支付平台证书。你也可以使用后面章节提到的“自动更新证书功能”,而不需要关心平台证书的来龙去脉。* apiV3Key是String格式的API v3密钥 参考: https://kf.qq.com/faq/180830E36vyQ180830AZFZvu.html* <p>* 参考文档 开发指引:https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_7_2.shtml*/

客户端:

@Slf4j
public class WechatPayHttpClientUtil {/*** merchantId商户号。* merchantSerialNumber商户API证书的证书序列号。* merchantPrivateKey商户API私钥,如何加载商户API私钥请看常见问题。* wechatpayCertificates微信支付平台证书。你也可以使用后面章节提到的“自动更新证书功能”,而不需要关心平台证书的来龙去脉。* apiV3Key是String格式的API v3密钥 参考: https://kf.qq.com/faq/180830E36vyQ180830AZFZvu.html* <p>* 参考文档 开发指引:https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_7_2.shtml*/@Value("${wxpay.merchantId:merchantId}")private String merchantId;@Value("${wxpay.merchantSerialNumber:merchantSerialNumber}")private String merchantSerialNumber;@Value("${wxpay.merchantPrivateKey:merchantPrivateKey}")private String merchantPrivateKey;@Value("${wxpay.apiV3Key:apiV3Key}")private String apiV3Key;public HttpClient createHttpClient() {try {// 加载商户私钥(privateKey:私钥字符串)PrivateKey privateKey = PemUtil.loadPrivateKey(new ByteArrayInputStream(merchantPrivateKey.getBytes("utf-8")));// 加载平台证书(mchId:商户号,mchSerialNo:商户证书序列号,apiV3Key:V3密钥)//https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient 自动更新证书功能AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(new WechatPay2Credentials(merchantId,new PrivateKeySigner(merchantSerialNumber, privateKey)),apiV3Key.getBytes("utf-8"));return WechatPayHttpClientBuilder.create().withMerchant(merchantId, merchantSerialNumber, privateKey).withValidator(new WechatPay2Validator(verifier)).build();} catch (Exception e) {log.error("createHttpClient exception ", e);}return null;}public String httpPost(String url, String param, Map<String, Object> headers) throws IOException {BufferedReader bufferedReader = null;try {HttpPost httpPost = new HttpPost(url);httpPost.setHeader("Content-Type", "application/json;charset=utf-8");httpPost.addHeader("Accept", "application/json");if (headers != null) {headers.keySet().forEach(key -> {httpPost.setHeader(key, headers.get(key).toString());});}if (StringUtils.isNotBlank(param)) {HttpEntity httpEntity = new StringEntity(param, "utf-8");httpPost.setEntity(httpEntity);}HttpResponse httpResponse = createHttpClient().execute(httpPost);if (httpResponse.getStatusLine().getStatusCode() != 200) {log.error("httpPost failed: url: {}, httpResponse: {}", url, JSON.toJSONString(httpResponse));}String output;bufferedReader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "utf-8"));StringBuilder stringBuilder = new StringBuilder();while ((output = bufferedReader.readLine()) != null) {stringBuilder.append(output);}return stringBuilder.toString();} catch (IOException e) {e.printStackTrace();throw e;} finally {if (bufferedReader != null)bufferedReader.close();}}public String httpPost2(String url, String body) {// HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi");HttpPost httpPost = new HttpPost(url);httpPost.addHeader("Accept", "application/json");httpPost.addHeader("Content-type", "application/json; charset=utf-8");ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectMapper objectMapper = new ObjectMapper();ObjectNode rootNode = objectMapper.createObjectNode();rootNode.put("mchid", "1900009191").put("appid", "wxd678efh567hg6787").put("description", "Image形象店-深圳腾大-QQ公仔").put("notify_url", "https://www.weixin.qq.com/wxpay/pay.php").put("out_trade_no", "1217752501201407033233368018");rootNode.putObject("amount").put("total", 1);rootNode.putObject("payer").put("openid", "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o");String bodyAsString = null;try {objectMapper.writeValue(bos, rootNode);//      httpPost.setEntity(new StringEntity(bos.toString("UTF-8"), "UTF-8"));httpPost.setEntity(new StringEntity(body, "UTF-8"));HttpResponse response = createHttpClient().execute(httpPost);bodyAsString = EntityUtils.toString(response.getEntity());} catch (IOException e) {e.printStackTrace();}return bodyAsString;}}

签名:

public class TokenUtil {/*** merchantId商户号。* merchantSerialNumber商户API证书的证书序列号。* merchantPrivateKey商户API私钥,如何加载商户API私钥请看常见问题。* wechatpayCertificates微信支付平台证书。你也可以使用后面章节提到的“自动更新证书功能”,而不需要关心平台证书的来龙去脉。* apiV3Key是String格式的API v3密钥 参考: https://kf.qq.com/faq/180830E36vyQ180830AZFZvu.html* <p>* 参考文档 开发指引:https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_7_2.shtml*/@Value("${wxpay.merchantId:merchantId}")private String merchantId;@Value("${wxpay.merchantSerialNumber:merchantSerialNumber}")private String merchantSerialNumber;@Value("${wxpay.merchantPrivateKey:merchantPrivateKey}")private String merchantPrivateKey;@Value("${wxpay.apiV3Key:apiV3Key}")private String apiV3Key;/*** 签名生成* https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_0.shtml** @param method* @param url* @param body* @return*/String getToken(String method, HttpUrl url, String body) {String nonceStr = "your nonce string";long timestamp = System.currentTimeMillis() / 1000;String message = buildMessage(method, url, timestamp, nonceStr, body);String signature = null;try {signature = sign(message.getBytes("utf-8"));} catch (Exception e) {e.printStackTrace();}return "mchid=\"" + merchantId + "\"," + "nonce_str=\"" + nonceStr + "\"," + "timestamp=\"" + timestamp + "\"," + "serial_no=\"" + merchantSerialNumber + "\"," + "signature=\"" + signature + "\"";}private String sign(byte[] message) throws SignatureException {Signature sign = null;try {// 加载商户私钥(privateKey:私钥字符串)PrivateKey privateKey = PemUtil.loadPrivateKey(new ByteArrayInputStream(merchantPrivateKey.getBytes("utf-8")));sign = Signature.getInstance("SHA256withRSA");sign.initSign(privateKey);sign.update(message);return Base64.getEncoder().encodeToString(sign.sign());} catch (Exception e) {e.printStackTrace();}return "";}private String buildMessage(String method, HttpUrl url, long timestamp, String nonceStr, String body) {String canonicalUrl = url.encodedPath();if (url.encodedQuery() != null) {canonicalUrl += "?" + url.encodedQuery();}return method + "\n" + canonicalUrl + "\n" + timestamp + "\n" + nonceStr + "\n" + body + "\n";}/*** 获取私钥。** @param filename 私钥文件路径  (required)* @return 私钥对象*/public static PrivateKey getPrivateKey(String filename) throws IOException {String content = new String(Files.readAllBytes(Paths.get(filename)), "utf-8");try {String privateKey = content.replace("-----BEGIN PRIVATE KEY-----", "").replace("-----END PRIVATE KEY-----", "").replaceAll("\\s+", "");KeyFactory kf = KeyFactory.getInstance("RSA");return kf.generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey)));} catch (NoSuchAlgorithmException e) {throw new RuntimeException("当前Java环境不支持RSA", e);} catch (InvalidKeySpecException e) {throw new RuntimeException("无效的密钥格式");}}
}

微信支付(小程序微信支付)相关推荐

  1. 如何使用计算机微信看小程序,微信电脑版怎么用小程序 在哪里打开

    现在有用户在玩微信中的小程序,不过在电脑端中部分用户却打不开小程序,那么到底是什么原因导致的呢?应该如何打开PC端中的微信小程序?先就通过这篇文章给大家介绍一下. 类别:聊天工具   大小:107.6 ...

  2. app微信登陆 小程序微信授权登陆

    最近在做一个项目兼容app和小程序 这里写一下这里面微信登陆的流程 这里有授权获取手机号弹窗 需用户手动点击按钮确认授权才行 <!-- 授权获取手机号弹窗 需用户手动点击按钮确认授权才行--&g ...

  3. 抖音头条小程序担保支付php版demo源码

    首先把配置文件填写完整: 1 2 3 4 5 6 7 // 支付相关配置 private static $config = array(     'app_id'        => '', / ...

  4. 微信小程序篇(微信小程序的支付)

    微信小程序的支付和微信公众号的支付是类似的,对比起来还比公众号支付简单了一些,我们只需要调用微信的统一下单接口获取prepay_id之后我们在调用微信的支付即可. 今天我们来封装一般node的支付接口 ...

  5. 调用支付jsapi缺少参数appid_服务商模式下的小程序微信支付

    最近,要做一个小程序商城的项目,需要在小程序中用到分账功能,也就是顾客购买商品支付的钱要给各个店铺,这就需要用到服务商模式. 在谈服务商模式下小程序微信支付之前,我们先要有一个服务商的商户号,这个商户 ...

  6. jsapi支付签名_微信支付小程序支付全流程

    点击蓝色字关注我们! 一个努力中的公众号 长的好看的人都关注了 本文给大家讲解微信小程序支付全流程,以及相关功能源代码,项目不开放,带来不便尽请谅解.小程序支付主要包含如下几步骤,1.预下单-调用微信 ...

  7. 微信小程序服务器支付sdk,微信小程序之支付后如何调用SDK的异步通知

    微信小程序之支付后如何调用SDK的异步通知 发布时间:2021-07-05 10:47:33 来源:亿速云 阅读:57 作者:小新 这篇文章主要介绍微信小程序之支付后如何调用SDK的异步通知,文中介绍 ...

  8. 小程序 php wecahtpay,【PHP】laravel 实现微信小程序微信支付功能

    准备工作 准备来laravel框架,下载好 overtrue/laravel-wechat 第三方插件composerrequireovertrue/wechat:~4.0-vvv PHP代码 调用支 ...

  9. 小程序 php wecahtpay,PHP 微信公众号,小程序获取支付参数。微信支付

    PHP 微信公众号,小程序获取支付参数.微信支付 发布时间:2018-09-26 11:19, 浏览次数:278 , 标签: PHP 首先下载微信官方demo放入项目中 地址:https://gith ...

  10. java 后台 小程序微信支付

    java 后台 小程序微信支付 步骤说明: 微信公众平台支付接口调试工具 #1.生成字符串: appid=appId&body=测试商品名称&mch_id=商户号&nonce_ ...

最新文章

  1. Ninject依赖注入——构造函数、属性、方法和字段的注入(三)
  2. 2021年1月20日 北京经纬恒润科技有限公司一面
  3. 编写代码的若干个基本规则(以Java为例)
  4. 简单了解RestTemplate
  5. ppt中的流程图怎么整体移动_PPT中图片太丑了?该怎么办?
  6. java实现加权抽样_用Java替换加权采样
  7. excel删除行闪退_excel2010闪退的处理方法
  8. Spring4-使用组件过滤器
  9. 编写程序,生成包含1000个0到100之间的随机整数,并统计每个元素的出现次数
  10. 管理结果集和分析结果集
  11. java day06【类与对象、封装、构造方法】
  12. 软件构建中的设计(一)
  13. 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。...
  14. win10安装VS2015
  15. 【渝粤教育】电大中专跨境电子商务理论与实务 (31)作业 题库
  16. Hash表的平均查找长度ASL计算方法
  17. Java多线程编程模式实战指南一:Active Object模式
  18. 微pe工具箱 系统安装教程_微PE工具箱安装系统教程(Win7或Win10)
  19. 201671010443 徐明锦 词频统计软件项目报告
  20. PMP-7. 项目经理及其影响力

热门文章

  1. 想学CNC编程的一定要看过来~
  2. 【架构师】零基础到精通——网关详解
  3. latex怎么看论文字数_如何使用LaTeX完成一篇论文的基本排版
  4. Android获取手机屏幕像素大小
  5. mysql 字符串截取,拼接
  6. 打开计算机管理窗口命令,Win7如何打开命令行窗口?打开命令行窗口的方法
  7. “5G通达,AI赋能“ AI在网络规划中的应用实践(人工智能应用案例)
  8. E - EXCEL排序
  9. pc端js根据图片url进行下载单张图片以及批量下载到本地
  10. CISCO CDP邻居发现协议