微信小程序支付的前置准备:
1.微信商户平台账号
2.微信小程序账号
3.微信小程序开通支付接口(个人暂时不支持开通支付)
前台需要的操作:
1.登录获取code,传给后台
2.获取后台传过来的值调用wx.requestPayment方法
后台需要的操作:
1.通过前台传过来的code来获取用户的openId
2.生成sign
3.获取perpay_id
4.再生成一次前台需要的paySign
具体操作:
登录获取code:
wx.login({
success: function(res){
// success
console.log('这里有code',res)
},
fail: function(res) {
// fail
},
complete: function(res) {
// complete
}
})
传到后台:
wx.request({
url: 'https://URL',//后台URL
data: {},//登录获取的code
method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
// header: {}, // 设置请求的 header//后台规定的请求头
//调用了之后无操作一下三个方法可以不写
success: function(res){
// success
},
fail: function(res) {
// fail
},
complete: function(res) {
// complete
}
})
后台通过过code获取oppenid只需要访问这个链接:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=前台传过来的CODE&grant_type=authorization_code
生成sign和得到perpay_id(此处后台用JAVA由于后台代码太多,我就放在最后面,有需要的可以自己进行查看)
其中获取perpay_id生成的sign需要的参数是我遇到的一个坑,请一定要注意你往微信传的值都是sign需要的value,其中openId在参数里面写的是否,但是微信小程序支付用到的trade_type是JSAPI,所以微信小程序的openId也是必须的参数。
当这些都准备好了之后你就可以获取perpay_id
接口链接
URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder
这个链接必须是xml格式的,前台是没法调用的。
有了perpay_id之后,在获取paySign(前台需要的)。这里不一定需要后台生成,前台也有相关的代码来生成。他需要的参数:
appId,nonceStr,package,signType,timeStamp,key
这是我遇到的坑二,因为你获取到了perpay_id时他会给你返回一个sign我之前以为是这个。
得到sign的代码:
/**
* 微信支付签名算法sign
* @param characterEncoding
* @param parameters
* @return
*/
@Test
public static String createSign(String characterEncoding,SortedMap<Object,Object> parameters){
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
Object v = entry.getValue();
if(null != v && !"".equals(v)
&& !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + WeChatPayUtils.key);
System.out.println("字符串:"+sb.toString());
String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
return sign;
}
MD5Util工具类代码如下:
package cn.cqzdkj.utils;
import java.security.MessageDigest;
public class MD5Util {
private static String byteArrayToHexString(byte b[]) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < b.length; i++)
resultSb.append(byteToHexString(b[i]));
return resultSb.toString();
}
private static String byteToHexString(byte b) {
int n = b;
if (n < 0)
n += 256;
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
public static String MD5Encode(String origin, String charsetname) {
String resultString = null;
try {
resultString = new String(origin);
MessageDigest md = MessageDigest.getInstance("MD5");
if (charsetname == null || "".equals(charsetname))
resultString = byteArrayToHexString(md.digest(resultString
.getBytes()));
else
resultString = byteArrayToHexString(md.digest(resultString
.getBytes(charsetname)));
} catch (Exception exception) {
}
return resultString;
}
private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
}
然后在需要的地方直接调用上面的ctreasign这个方法就行了。
SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();
parameters.put("appid", appid);
parameters.put("mch_id", mch_id);
parameters.put("nonce_str",nonce_str);
parameters.put("body", body);
parameters.put("out_trade_no", "20170215");
parameters.put("total_fee", 1);
parameters.put("spbill_create_ip", "x.x.x.x");
parameters.put("notify_url","http://xxxxx.com");
parameters.put("trade_type", "JSAPI");
parameters.put("openid", "oGY_ZvxxxxxM");
parameters.put("sign","");
String characterEncoding = "UTF-8";
String mySign = createSign(characterEncoding,parameters);
System.out.println("我 的签名是:"+mySign);
干活系列项目地址:
码云:https://gitee.com/mrxu314/xcx_gh
gitHub:https://github.com/mrxu0/xcx_gh
希望这篇文章能够帮助到你们
欢迎大家关注我的公众号吵吵日记:
译者:guobaoyo示例:从Pytorch到Caffe2的端对端AlexNet模型这里是一个简单的脚本程序,它将一个在 torchvision 中已经定义的预训练 AlexNet 模型导出到 ONNX 格式. 它会运行一次,然后把模型保存至 alexnet.onnx:import torchimport torchvisiondummy_input = torch.randn(1...
有朋友问我平时都是在哪里自学的呢?大学四年以来我收藏了各种学习网站今天一次性分享给大家,一起学习!一、视频类自学网站1.哔哩哔哩自学观看各种教程视频,比较推荐B站,各个领域极其全面。网址:https://www.bilibili.com/2.慕课网这个网站也是比较常用的,有各种实用的教程,如果你想快速入门一种语言的话,可以到这看看。网址:https://www.imooc.com...
满意答案uahyiw2020.02.11采纳率:51%等级:11已帮助:6110人一.关机、睡眠的快捷键:1.先按左下角“windows“键,再按字母“U“键,再按字母“U”或“S”键。2.在桌面状态下按 ALT+F4 再按“U”键或者“S”键。二.windows快捷键1.单独按Windows:显示或隐藏“开始”功能表。2.Windows+BREAK:显示“系统属性”对话框。3.windo...
增强for循环用法1.首先增强for循环和iterator遍历的效果是一样的,也就说增强for循环的内部也就是调用iteratoer实现的,但是增强for循环有些缺点,例如不能在增强循环里动态的删除集合内容。不能获取下标等。2.ArrayList由于使用数组实现,因此下标明确,最好使用普通循环。3.而对于LinkedList 由于获取一个元素,要从头开始向后找,因此建议使用增强
sudo gedit /etc/default/apport //进行apport设置更改enabled = 0 ,就再也不会弹出了。为什么会出现该弹框:原因是Ubuntu系统是有bug的因此需要用户的反馈,但是用户反馈了开发者也不一定看到。就是说当我们永久关闭弹框之后,对ubuntu系统的改善是有一定影响的。但是影响不大。...
开发二维码时候,报出的Bug,
简介WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。其他特点包括:(1)建立在 TCP 协议之上,服务器端的实现比较容易。(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。(3)数据格式比较轻量,性能开销
Docker镜像容器的基石层叠的只读文件系统联合加载(union mount)docker镜像文件目录/var/lib/docker/aufs/mnt镜像的基本操作列出镜像shell:docker images [OPTSIONS][REPOSITORY] -a --all = false 显示所有镜像 -f --filter = [] 显示时的过滤条件
泰勒展开式一元函数Taylor展开f(x)=f(x0)+f,(x0)(x−x0)+f,,(x)2(x−x0)2+...+fn(x)n(x−x0)n+Rf( x) =f( x_{0}) +f^{,}( x_{0})( x-x_{0}) +\frac{f^{,,}( x)}{2}( x-x_{0})^{2} +...+\frac{f^{n}( x)}{n}( x-x_{0})^{n}+R二元函数Ta
#chinese-ocr自然场景下不定长文字识别(ctpn + densenet)注:本文中多处使用各位前辈的经验,项目代码不方便提供,可百度下载参考##实现功能文字方向检测 0、90、180、270度检测文字检测 后期将切换到keras版本文本检测 实现keras端到端的文本检测及识别不定长OCR识别##环境部署GPU环境sh setup.shCPU环境sh setup-cp...
一、排序算法排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。Python内置的sorted()函数就可以对list进行排序:>>> sorted([36, 5, -12, 9, -21])[-21, -12, 5, 9...
python-3.7 pycharm serborn-0.9.0""" 可视化库Seaborn 时间:2018\9\13 0013 分析图绘制,Seaborn封装自Matplotlib"""import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom...