微信支付-全面详解(学习总结---从入门到深化)
微信支付_产品介绍
微信支付介绍
微信支付(https://pay.weixin.qq.com)是腾讯集团旗下中国领先 的第三方支付平台,一直致力于为用户和企业提供安全、便捷、专业的在线支付服务。
付款码支付
付款码支付是指用户展示微信钱包内的“付款码”给商户系统扫描后 直接完成支付,适用于线下场所面对面收银的场景,例如商超、便利店、餐饮、医院、学校、电影院和旅游景区等具有明确经营地址的实体场所。
使用示例
JSAPI支付
JSAPI支付是指商户通过调用微信支付提供的JSAPI接口,在支付场景中调起微信支付模块完成收款。
使用示例
小程序支付
小程序支付是指商户通过调用微信支付小程序支付接口,在微信小程序平台内实现支付功能;用户打开商家助手小程序下单,输入支付密码并完成支付后,返回商家小程序。
使用示例
Native支付
Native支付是指商户系统按微信支付协议生成支付二维码,用户再 用微信“扫一扫”完成支付的模式。该模式适用于PC网站、实体店单品或订单、媒体广告支付等场景。
使用示例
APP支付
APP支付是指商户通过在移动端应用APP中集成开放SDK调起微信支付模块来完成支付。适用于在移动端APP中集成微信支付功能的场景。
使用示例
刷脸支付
刷脸支付是指用户在刷脸设备前通过摄像头刷脸、识别身份后进行 的一种支付方式,安全便捷。适用于线下实体场所的收银场景,如 商超、餐饮、便利店、医院、学校等。
使用示例
1.微信支付是__集团旗下中国领先的第三方支付平台。腾讯
2.可以手动设置支付金额是____支付方式。JSAPI支付
微信支付_前期准备工作
获取商户号
微信商户平台:https://pay.weixin.qq.com/
场景:Native支付
获取APPID
微信公众平台:https://mp.weixin.qq.com/
注册流程
关联流程
APPID:微信公众号 =》 开发管理 =》 开发设置 =》 获取AppID
申请商户API证书
获取秘钥和证书
注意: 以上所有API秘钥和证书需妥善保管防止泄露。
这个样子就是申请成功了
申请证书
下载安装证书工具
工具生成证书
复制请求串
验证密码
生成证书
生成证书
本地文件
注意:
1、aplclient_cert.p12:包含了私钥信息得证书文件。
2、apiclient_cert.pem:从apiclient_cert.p12中导出证书部分的文件,为pem格式,请妥善保 管。
3、apiclient_key.pem:部分开发语言和环境不能使用p12文件,需要使用pem文件为了方便, 直接提供。
获取API秘钥
APIv2版本的接口需要此秘钥
步骤:登录商户平台 => 选择 账户中心 => 安全中心 => API安全 => 设置API密钥
生成随机密码https://suijimimashengcheng.bmcx.com/
支付安全_信息安全的基础
密码学基本概念
密码学是网络安全、信息安全、区块链等产品的基础,常见的非对称加密、对称加密、散列函数等,都属于密码学范畴。
中国古代加密
公元683年,唐中宗即位。随后,武则天废唐中宗,立第四子李旦为皇帝,但朝政大事均由她自己专断。裴炎、徐敬业和骆宾王等人 对此非常不满。徐敬业聚兵十万,在江苏扬州起兵。裴炎做内应, 欲以拆字手段为其传递秘密信息。后因有人告密,裴炎被捕,未发出的密信落到武则天手中。这封密信上只有“青鹅”二字,群臣对此大惑不解。
破解:
武则天破解了“青鹅”的秘密:“青”字拆开来就是“十二月”,而“鹅” 字拆开来就是“我自与”。密信的意思是让徐敬业、骆宾王等率兵 于十二月进发,裴炎在内部接应。“青鹅”破译后,裴炎被杀。接着,武则天派兵击败了徐敬业和骆宾王。
明文
加密前的消息叫“明文”(plain text)。
密文
加密后的文本叫“密文”(cipher text)。
密钥
只有掌握特殊“钥匙”的人,才能对加密的文本进行解密,这里的“钥 匙”就叫做“密钥”(key)。
1.下列属于非对称加密算法的是____。RSA
支付安全_消息摘要
摘要算法就是我们常说的散列函数、哈希函数(Hash Function),它能够把任意长度的数据“压缩”成固定长度、而且独 一无二的“摘要”字符串,就好像是给这段数据生成了一个数字“指纹”。
作用:
保证信息的完整性
回顾之前数字摘要
百度搜索 MySQL ,进入官网下载 ,会经常发现有 sha1 , sha512 , 这些 都是数字摘要。
点击signature
消息摘要实现
public static void main(String[] args) throws Exception{// 原文String input = "xiaotong";// 算法String algorithm = "MD5";// 获取数字摘要对象MessageDigest messageDigest = MessageDigest.getInstance(algorithm);// 获取消息数字摘要的字节数组byte[] digest = messageDigest.digest(input.getBytes());System.out.println(new String(digest));}
注意: 加密后编码表找不到对应字符, 出现乱码
base64 编码
public static void main(String[] args) throws Exception{// 原文String input = "aa";// 算法String algorithm = "MD5";// 获取数字摘要对象MessageDigest messageDigest = MessageDigest.getInstance(algorithm);// 消息数字摘要byte[] digest = messageDigest.digest(input.getBytes());// System.out.println(new String(digest));// base64编码System.out.println(new BASE64Encoder().encode(digest));}
1.下列可以实现消息摘要算法的是__。MD5
2.消息摘要算法主要作用_______。保证数据完整性
支付安全_对称加密
对称加密
对称加密指的就是加密和解密使用同一个秘钥,所以叫做对称加密。对称加密只有一个秘钥,作为私钥。
对称加密实现
package com.itbaizhan.encryption;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
/*** DesAesDemo*/
public class DesAesDemo {public static void main(String[] args) throws Exception {// 原文String input = "xiaotong";// des加密必须是8位String key = "123456";// 算法String algorithm = "DES";String transformation = "DES";// Cipher:密码,获取加密对象// transformation:参数表示使用什么类型加密Cipher cipher = Cipher.getInstance(transformation);// 指定秘钥规则// 第一个参数表示:密钥,key的字节数组// 第二个参数表示:算法SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);// 对加密进行初始化// 第一个参数:表示模式,有加密模式和解密模式// 第二个参数:表示秘钥规则cipher.init(Cipher.ENCRYPT_MODE,sks);// 进行加密byte[] bytes = cipher.doFinal(input.getBytes());// 打印字节,因为ascii码有负数,解析不出来,所以乱码// for (byte b : bytes) {// System.out.println(b);// }// 打印密文System.out.println(new String(bytes));}
}
报错
注意: 密钥是6个字节,DES加密算法规定,密钥key必须是8个字节, 所以需要修改上面key改成key="12345678"
注意: 出现乱码是因为对应的字节出现负数,但负数,没有出现在 ascii 码表里面,所以出现乱码,需要配合base64进行转码。
解密
package com.itbaizhan.encryption;
import cn.hutool.core.codec.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
/**
* DesAesDemo
*/
public class DesAesDemo {public static void main(String[] args) throws Exception {// 原文String input = "baizhan";// des加密必须是8位String key = "12345678";// 算法String algorithm = "DES";String transformation = "DES";String s = encryptDES(input, key, algorithm, transformation);String test = "znLsz/8WnU4=";String s1 = decryptDES(test, key, algorithm, transformation);System.out.println(s1);}/*** 使用DES加密数据** @param input : 原文* @param key : 密钥(DES,密钥的长度必须是8个字节)* @param transformation : 获取Cipher对象的算法* @param algorithm : 获取密钥的算法* @return : 密文* @throws Exception*/private static String encryptDES(String input, String key, String transformation,String algorithm) throws Exception {// 获取加密对象Cipher cipher = Cipher.getInstance(transformation);// 创建加密规则// 第一个参数key的字节// 第二个参数表示加密算法SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);// ENCRYPT_MODE:加密模式// DECRYPT_MODE: 解密模式// 初始化加密模式和算法cipher.init(Cipher.ENCRYPT_MODE,sks);// 加密byte[] bytes = cipher.doFinal(input.getBytes());// 输出加密后的数据String encode = Base64.encode(bytes);return encode;}/*** 使用DES解密** @param input : 密文* @param key : 密钥* @param transformation : 获取Cipher对象的算法* @param algorithm : 获取密钥的算法* @throws Exception* @return: 原文*/private static String decryptDES(Stringinput, String key, String transformation,String algorithm) throws Exception {// 1,获取Cipher对象Cipher cipher = Cipher.getInstance(transformation);// 指定密钥规则SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);cipher.init(Cipher.DECRYPT_MODE, sks);// 3. 解密,上面使用的base64编码,下面直接用密文byte[] bytes = cipher.doFinal(Base64.decode(input));// 因为是明文,所以直接返回return new String(bytes);}
}
1.对称加密采用___钥密码系统的加密方法。单
2.下列属于对称加密算法的是_____。DES
支付安全_非对称加密
非对称加密
非对称加密指的是:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密。
非对称加密实现
引入依赖
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version> </dependency>
生成公钥和私钥
import com.sun.org.apache.xml.internal.security.utils.Base64;
import org.apache.commons.io.FileUtils;
import javax.crypto.Cipher;
import java.io.File;
import java.nio.charset.Charset;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
/**
* 生成公钥和私钥
*/
public class RSAdemo {
public static void main(String[] args) throws Exception {String input = "xiaotong";// 加密算法String algorithm = "RSA";//生成密钥对并保存在本地文件中generateKeyToFile(algorithm, "a.pub","a.pri");}/*** 生成密钥对并保存在本地文件中** @param algorithm : 算法* @param pubPath : 公钥保存路径* @param priPath : 私钥保存路径* @throws Exception*/private static void generateKeyToFile(String algorithm, String pubPath, String priPath) throws Exception {// 获取密钥对生成器KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);// 获取密钥对KeyPair keyPair = keyPairGenerator.generateKeyPair();// 获取公钥PublicKey publicKey = keyPair.getPublic();// 获取私钥PrivateKey privateKey = keyPair.getPrivate();// 获取byte数组byte[] publicKeyEncoded = publicKey.getEncoded();byte[] privateKeyEncoded = privateKey.getEncoded();// 进行Base64编码String publicKeyString = Base64.encode(publicKeyEncoded);String privateKeyString = Base64.encode(privateKeyEncoded);// 保存文件FileUtils.writeStringToFile(new File(pubPath), publicKeyString,Charset.forName("UTF-8"));FileUtils.writeStringToFile(new File(priPath), privateKeyString,Charset.forName("UTF-8"));}
运行程序:先打印的是私钥 , 后面打印的是公钥
私钥加密
/*** 读取私钥* @param priPath* @param algorithm* @return* @throws Exception*/public static PrivateKey getPrivateKey(String priPath,String algorithm) throws Exception{// 将文件内容转为字符串String privateKeyString = FileUtils.readFileToString(new File(priPath),Charset.defaultCharset());// 获取密钥工厂KeyFactory keyFactory = KeyFactory.getInstance(algorithm);// 构建密钥规范 进行Base64解码PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(Base64.decode(privateKeyString));// 生成私钥return keyFactory.generatePrivate(spec);}
public static void main(String[] args) throws Exception {String input = "xiaotong";// 加密算法String algorithm = "RSA";// 加载私钥PrivateKey privateKey = getPrivateKey("a.pri", algorithm);// 私钥加密String s = encryptRSA(algorithm, privateKey, input);System.out.println(s);}
公钥加密
/*** 读取公钥* @param pulickPath* @param algorithm* @return* @throws Exception*/public static PublicKey getPublicKey(String pulickPath,String algorithm) throws Exception{// 将文件内容转为字符串String publicKeyString = FileUtils.readFileToString(new File(pulickPath), Charset.defaultCharset());// 获取密钥工厂KeyFactory keyFactory = KeyFactory.getInstance(algorithm);// 构建密钥规范 进行Base64解码X509EncodedKeySpec spec = new X509EncodedKeySpec(Base64.decode(publicKeyStrin
g));// 生成公钥return keyFactory.generatePublic(spec);}public static void main(String[] args) throws Exception {String input = "xiaotong";// 加密算法String algorithm = "RSA";// 加载公钥PublicKey publicKey = getPublicKey("a.pub", algorithm);// 公钥解密String s = encryptRSA(algorithm, publicKey, "密文");System.out.println(s);}
1.下列加密算法中属于非对称加密的是__。RSA
支付安全_数字签名
数字签名是什么
数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别 人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发 送信息真实性的一个有效证明。数字签名是非对称密钥加密技术与 数字摘要技术的应用。
生活中的数据签名
相信我们都写过信,在写信的时候落款处总是要留下自己的名字, 用来表示写信的人是谁。我们签的这个字就是生活中的签名。
注意: 在网络中传输数据时候,给数据添加一个数字签名,表示是谁 发的数据,而且还能证明数据没有被篡改。OK,数字签名的主 要作用就是保证了数据的有效性(验证是谁发的)和完整性 (证明信息没有被篡改)。
基本原理
张三有两把钥匙,一把是公钥,另一把是私钥。张三把公钥送给他 的朋友们----铁蛋、幺妹、李四----每人一把。
幺妹要给张三写一封保密的信。她写完后用张三的公钥加密,就可 以达到保密的效果。
张三收信后,用私钥解密,就看到了信件内容。这里要强调的是, 只要张三的私钥不泄露,这封信就是安全的,即使落在别人手里, 也无法解密。
张三给幺妹回信,决定采用"数字签名"。他写完后先用Hash函数, 生成信件的摘要(digest)。
张三使用私钥,对这个摘要加密,生成"数字签名"(signature)。 幺妹收信后,取下数字签名,用张三的公钥解密,得到信件的摘要。由此证明,这封信确实是张三发出的。幺妹再对信件本身使用 Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。
1.数字签名主要解决_______问题。数据被篡改问题
支付安全_数字证书
为什么需要数字证书
复杂的情况出现了。李四想欺骗幺妹,他偷偷使用了幺妹的电脑, 用自己的公钥换走了张三的公钥。此时,幺妹实际拥有的是李四的 公钥,但是还以为这是张三的公钥。因此,李四就可以冒充张三, 用自己的私钥做成"数字签名",写信给幺妹,让幺妹用假的张三公钥进行解密。
后来,幺妹感觉不对劲,发现自己无法确定公钥是否真的属于张三。她想到了一个办法,要求张三去找"证书中心"(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对张三的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate)。
理解数据证书
比如说我们的毕业证书,任何公司都会承认。为什么会承认?因为 那是国家发得,大家都信任国家。也就是说只要是国家的认证机 构,我们都信任它是合法的。
原理
为了解决公钥的信任问题,张三和幺妹找一家认证公司(CA Catificate Authority),把公钥进行认证,证书中心用自己的私 钥,对A的公钥和一些相关信息一起加密,生成“数字证书”(Digital Certificate)
幺妹如果获取到证书,证书可以用CA的公钥(认证中心信用背书) 进行解密,会得到发公钥人的信息,以及他的公钥,此时这个A的公钥是可信的。
所以张三给幺妹发送信息的时候,就会带上签名,和证书一并发送 给到互联网上,幺妹接收到消息的时候,先用CA发布的公钥解密数 字证书,得到张三的公钥,用张三的公钥解密签名,得到摘要,幺妹在用hash算法得到消息的摘要,对两个摘要对比,如果相等,说明消息在网络上没有被不法分子修改。
1.数字证书解决____,可以防止黑客伪造公钥。公钥不信任问题
支付项目_功能演示
首页
我的订单
订单详情页
支付工程准备_创建支付工程
新建工程
微信支付-全面详解(学习总结---从入门到深化)相关推荐
- 微信支付 php详解,PHP实现微信支付实战案例详解
这次给大家带来PHP实现微信支付实战案例详解,PHP实现微信支付的注意事项有哪些,下面就是实战案例,一起来看一下. 前期准备: 1.微信认证服务号,并且开通了微信支付 2.微信支付SDK,下载地址:h ...
- 微信支付 php详解,微信支付之公众号支付详解
本文主要和大家分享微信支付之公众号支付详解,随着微信支付的流行,大多产品都开发了自己的公众号.小程序等,产品的营销需要支付的支撑,最近做了个微信公号号支付,采坑无数,今天给大家分享一下,希望能帮助到大 ...
- python 微信支付接口 详解_Python支付接口汇总大全(包含微信、支付宝等,长期更新、欢迎补充)...
wzhifuSDK- 由微信支付SDK 官方PHP Demo移植而来,v3.37下载地址 学习Python中有不明白推荐加入交流群 号:864573496 群里有志同道合的小伙伴,互帮互助, 群里有不 ...
- iOS中 最新微信支付/最全的微信支付教程详解 韩俊强的博客
亲们, 首先让我们来看一下微信支付的流程吧. 1. 注册微信开放平台,创建应用获取appid,appSecret,申请支付功能,申请成功之后会返回一些参数. 2. 下载微信支付sdk 3. 客户端请求 ...
- IOS 微信支付流程详解
一.配置 1.info.plist中配置LSApplicationQueriesSchemes (NSArray) item :weixin 2.设置项目属性中的URL Schemes为您的AP ...
- android微信支付代码,详解android微信支付实例代码
这篇文章主要为大家详细介绍了http://www.php.cn/wiki/1502.html" target="_blank">android微信支付源码,具有一定 ...
- 微信支付php详解 php,ThinkPHP框架整合微信支付之刷卡模式图文详解
本文实例讲述了ThinkPHP框架整合微信支付之刷卡模式.分享给大家供大家参考,具体如下: 大家好,这篇文章是继微信支付之Native 扫码支付 模式二之后的微信支付系列教程第四篇:微信刷卡支付 本教 ...
- Java对接微信公众平台详解
Java对接微信公众平台详解 1.公众平台概述 1.1 公众平台概述 1.2 入门指引 2.对接流程 2.1 接入概述 2.2 填写服务器配置 2.3 接口域名说明 2.4 获取Access toke ...
- Java线程池详解学习:ThreadPoolExecutor
Java线程池详解学习:ThreadPoolExecutor Java的源码下载参考这篇文章:Java源码下载和阅读(JDK1.8) - zhangpeterx的博客 在源码的目录java/util/ ...
最新文章
- Ubuntu16.04打开和关闭桌面显示
- ML:MLOps系列讲解之《MLOps Stack Canvas堆栈画布之MLOps Stack CanvasCRISP-ML(Q)》解读
- 【jQuery源码】select方法
- Collection中list集合的应用常见的方法
- WPF笔记(1.1 WPF基础)——Hello,WPF!
- (十)深入浅出TCPIP之网络阻塞和非阻塞
- stm32f767中文手册_ALIENTEK 阿波罗 STM32F767 开发板资料连载第五章 SYSTEM 文件夹
- spark基础之checkpoint机制
- python绘制一棵樱花树
- 霍夫斯特拉大学计算机科学专业排名,Hofstra University霍夫斯特拉大学介绍及排名信息...
- Unicode字符集和多字节字符集关系
- 线性代数学习指导与MATLAB编程实践,21世纪高等理工科重点课程辅导丛书:线性代数学习指导与MATLAB编程实践...
- 素数表(Prime number table)
- tp ajax 多图上传,TP5 Ajax上传图片
- (转载)file_get_contents(php://input)
- Springboot启动提示:com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException UNAVAILAB
- 提高Java反射速度的方法以及对setAccessable的误解
- 前端学习笔记(js基础知识)
- 在字符串中查找一个字符
- anaconda3安装注意事项以及pytorch环境配置