微信公众号使用uniappH5、python对接微信支付V3-JSAPI的支付功能

这篇具有很好参考价值的文章主要介绍了微信公众号使用uniappH5、python对接微信支付V3-JSAPI的支付功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

微信公众号网页用uniapp,后台用的python,近期对接微信支付-apiv3版-jsapi支付,特此整理记录方便日后查找使用

apiv3升级后,请求体使用不用xml使用json,每次请求需要在header中添加签名,而签名需要用微信支付的商户证书私钥进行RSA加密

使用公众号进行对接流程如下

  1. 先保存公众号开发所需要的access_token与jssdk调用需要的jsapi_ticket
  2. 引入微信js-sdk
  3. 添加公众号域名白名单
  4. 请求后台,返回注入js-sdk所需要的参数
  5. 使用参数对js-sdk进行注入
  6. 使用公众号文档中的网页授权流程第一步先获取到授权所需code
  7. 使用code请求后台,后台通过网页授权流程第二步获取用户的openid后,一并返回支付所需要的参数
  8. 使用支付参数进行sdk的支付调用
  9. 后台通过回调接口来接收并保存支付状态

1、自行保存公众号access_token与jsapi_ticket

公众号access_token获取文档
公众号网页开发jsapi_ticket获取文档

uniapp-支付页面先引入注入微信网页开发所用的JS-SDK

微信公众号网页开发文档地址

// 支付页面代码
// 在页面onload中引入微信sdk,在APP.vue引入好像有点问题,不过为了保险起见,在App.vue页面再引入了一次
onLoad(e) {
	var script =document.createElement('script');
	script.src = "/static/js/jweixin-1.6.0.js";
	script.type = 'text/javascript';
	document.body.appendChild(script)
}
// App.vue页面
onShow: function() {
	console.log('App Show')
	// 引入微信sdk
	const script = document.createElement('script');
	script.src = "https://res.wx.qq.com/open/js/jweixin-1.6.0.js";
	script.type = 'text/javascript';
	document.body.appendChild(script)
}

2、在微信公众号 头像>功能设置页中进行配置域名白名单,把业务域名、JS接口安全域名、网页授权域名
全部添加。

公众号设置超链接

uniapp 微信公众号支付,微信支付,python,uniapp,微信

3、请求后台,返回注入js所需要的参数
注入时遇到的问题
3.1、签名出错,查看参数,查看加密方式,查看url参数(出错较多)
3.2、jsapi_list为空列表[]也不可以,提示fail,添加一个权限就可以了

注入js-sdk微信文档

//uniapp支付页关键代码
//注入js有一个当前页面的url,所以这里把当前的url保存传到后台,之前后台写死会出现不一致的问题,保险起见,这里由前端把url传入

var currentUrl = window.location.href;
var token = uni.getStorageSync('token')
	var data = {
		token: token,
		appid: 'xxxx',
		url: currentUrl
	}

# python端关键代码-js注入参数生成

def jszhuru(appid, url, debug):
    """jsapi注入"""
	#生成随机数
    noncestr = str(uuid.uuid4()).replace('-', '')
	# 这里请求数据库,拿到jsapi_ticket
    # jsapi_ticket=xxxxxxxxxx
    timestamp = int(time.time())

    sing_str = "jsapi_ticket={}&noncestr={}&timestamp={}&url={}".format(jsapi_ticket, noncestr, timestamp, url)
    sha1_hash = hashlib.sha1()
    sha1_hash.update(sing_str.encode('utf-8'))
    sha1_sign = sha1_hash.hexdigest()

    result = {
        'debug': debug,
        "appid": appid,
        'noncestr': noncestr,
        "timestamp": timestamp,
        "signature": sha1_sign,
        "url": url,
        "jsapi_list": ['chooseImage']
    }

    return result

4、h5端注入js-sdk

// uniapp支付页关键代码

wx.config({
	debug: e.data.data.result.debug, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
	appId: String(e.data.data.result.appid), // 必填,公众号的唯一标识
	timestamp: String(e.data.data.result.timestamp), // 必填,生成签名的时间戳
	nonceStr: String(e.data.data.result.noncestr), // 必填,生成签名的随机串
	signature: String(e.data.data.result.signature), // 必填,签名
	jsApiList: e.data.data.result.jsapi_list // 必填,需要使用的JS接口列表
});

wx.ready(function() {
	that.zhuru_status = true
});

wx.error(function(res) {
	that.zhuru_status = false
	uni.showToast({
		title:'微信支付加载失败',
		icon:'none'
	})
});

5、使用前端传来的code获取openid,之后调用下单接口,获取prepay_id,然后返回下单所需要的参数,前端调用支付功能

code获取openid微信文档

# 获取openid关键代码
url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=xxx&secret=xxx&code=' + code + '&grant_type=authorization_code'
resp = requests.get(url)
resp_dict = json.loads(resp.text)
print(resp.text)
openid = resp_dict.get('openid')
# 后台请求jsapi下单接口关键代码
def xiadan(out_trade_no,description, amount_total, openid):
    """jsapi下单"""

    # 订单过期时间
    now = datetime.datetime.now()
    # 计算1小时后的时间
    future_time = now + relativedelta(hours=1)
    # 将时间格式化为RFC 3339标准格式
    time_expire = future_time.strftime('%Y-%m-%dT%H:%M:%S.%f') + 'Z'

    appid = 'xxxx'

    body_dict_list = [
        {'key': 'appid', 'doc': '应用id', 'value': appid},
        {'key': 'mchid', 'doc': '商户id', 'value': MCHID},
        {'key': 'description', 'doc': '商品描述', 'value': description},
        {'key': 'out_trade_no', 'doc': '内部订单号', 'value': out_trade_no},
        {'key': 'time_expire', 'doc': '订单过期时间', 'value': time_expire},
        {'key': 'notify_url', 'doc': '回调url', 'value': NOTIFY_URL},
        {'key': 'amount', 'doc': '金额', 'value': {'total': amount_total}},
        {'key': 'payer', 'doc': 'openid', 'value': {'openid': openid}},

    ]

    # 2、字典排序
    body_sort_list = sorted(body_dict_list, key=lambda x: x['key'])

    # 生成请求体
    body_dict = {}
    for item in body_sort_list:
        key = item.get('key')
        value = item.get('value')
        body_dict[key] = value

    # 拼接证书的路径
    current_file_path = os.path.abspath(__file__)
    current_directory = os.path.dirname(current_file_path)
    current_cwd = current_directory.replace('\\', '/')
    current_cwd_end_index = current_cwd.rfind('/')
    dir_path = current_cwd[:current_cwd_end_index]
    private_path = os.path.join(dir_path, 'cert', 'pkcs1_private.pem')
    cert_path = os.path.join(dir_path, 'cert', 'apiclient_cert.pem')
    print('私钥路径', private_path)
    print('证书路径', cert_path)

    # 8、发起请求
    result = wxfunc.wxpay_http(method='POST', path='/v3/pay/transactions/jsapi', body=body_dict,
                               private_key_pkcs1_path=private_path, cert_path=cert_path,
                               )

    return json.loads(result)


	
# 后台生成调用支付参数部分-生成签名的关键代码

nonce_str = str(uuid.uuid4()).replace('-', '')
time_stamp = int(time.time())
appid = 'wxxxxxxx'
package = 'prepay_id=' + prepay_id

# 生成签名
sign_str = '{}\n{}\n{}\n{}\n'.format(appid,
                                    time_stamp,
                                    nonce_str,
                                    package
                                    )
sign = sha256_with_rsa(sign_str, private_path)

amount_total = order_info.amount_total
amount_str = str(Decimal(str(amount_total)) / 100)

body_dict_list = [
   {'key': 'appId', 'doc': '应用id', 'value': str(appid)},
   {'key': 'timeStamp', 'doc': '时间戳', 'value': str(time_stamp)},
   {'key': 'nonceStr', 'doc': '随机数', 'value': str(nonce_str)},
   {'key': 'package', 'doc': '下单id', 'value': str(package)},
   {'key': 'signType', 'doc': '签名类型', 'value': 'RSA'},
   {'key': 'paySign', 'doc': '签名值', 'value': sign},
   {'key': 'description', 'doc': '商品描述', 'value': order_info.description},
   {'key': 'amount', 'doc': '金额', 'value': amount_str},
   {'key': 'order_id', 'doc': '订单号', 'value': order_id},
]

"""...返回调用支付所需要的参数"""

6、前端获取调用所需要的参数,发起支付

微信调起jsapi支付方式文档文章来源地址https://www.toymoban.com/news/detail-783825.html

// js调起支付

WeixinJSBridge.invoke('getBrandWCPayRequest', {
	"appId": that.zhifu_dict.appId, //公众号ID,由商户传入     
	"timeStamp": that.zhifu_dict.timeStamp, //时间戳,自1970年以来的秒数     
	"nonceStr": that.zhifu_dict.nonceStr, //随机串     
	"package": that.zhifu_dict.package,
	"signType": that.zhifu_dict.signType, //微信签名方式:     
	"paySign": that.zhifu_dict.paySign
},
function(res) {
	if (res.err_msg == "get_brand_wcpay_request:ok") {
		uni.showToast({
			title:'支付成功',
			icon:'success'
		})
		// 使用以上方式判断前端返回,微信团队郑重提示:
		//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
	}
});

到了这里,关于微信公众号使用uniappH5、python对接微信支付V3-JSAPI的支付功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ChatGPT 对接微信公众号技术方案实现!

    作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!😄 9天假期写了8天代码和10篇文章,这个5.1过的很爽🤨! 如假期前小傅哥的计划一样,这个假期开启了新的技术项目《ChatGPT 微服务应用体系构建》教程; 从搭建环境 、 开发chatgpt-sdk-ja

    2024年02月03日
    浏览(34)
  • 前端对接微信公众号网页开发流程,前期配置

    微信公众号网页开发,其实就是我们开发的h5网页需要放到微信浏览器环境中使用,但是需要对接公众号授权,授权之后可以获取到用户的个人信息,以及可以使用公众号提供的一些API,如:图片上传、图片预览、获取位置信息、微信扫一扫等功能。在没有对接正式公众号之前

    2024年01月20日
    浏览(34)
  • 微信建行支付对接

    建行微信支付 代码参考 java实现对接建行支付及其回调 参考链接一 微信小程序使用建行支付 参考链接二 微信小程序,调用建行支付 参开链接三 集成建行聚合支付踩过的坑,有些槽不吐不快 建行支付里三大步骤与坑 验签也有顺序 Java实现建行聚合支付对接及其回调 这里我

    2023年04月08日
    浏览(24)
  • 对接微信支付接口

    https://pay.weixin.qq.com/wiki/doc/api/index.html 1.准备工作: 在微信上申请服务号类型的公众号,从公众号获取以下数据 appid:微信公众账号或开放平台APP的唯一标识 mch_id:商户号 (配置文件中的partner) partnerkey:商户密钥 2. 根据项目需求选择适合的支付方式,本例使用Native支付方式

    2024年02月13日
    浏览(41)
  • java对接微信支付:JSAPI支付成功之“微信回调”

    承接上一篇微信支付,现在简单说一下 微信支付回调 目录 一、支付回调 二、微信回调地址问题 1.本地/上线测试 2.控制器调用接口(代码) 总结 当用户支付成功之后,支付平台会向我们指定的服务器接口发送请求传递订单支付状态数据 如果你是再本地进行测试,那就需要使用

    2024年02月12日
    浏览(28)
  • 2023微信支付对接全流程

    简单说一下微信支付的几种类型的应用场景以及前提条件 官方文档:https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml 前提条件: 1.需要一个载体公众号或者小程序,公众号要是服务号不是订阅号。 2.小程序和公众号支付都要认证,要300rmb。 3.需要一个商户号,绑定公众号或者小程序

    2024年02月05日
    浏览(28)
  • 微信小程序支付-java对接微信

     一共是两个方法: 一个方法后台生成预支付订单,得到预支付交易会话标识prepay_id,传给前端,让前端调起小程序支付; 一个是支付回调 目录 一、生成预支付订单  注意: 二、 支付回调         封装参数向微信发送生成预支付交易单请求,微信会返回一个prepay_id,再将

    2024年02月12日
    浏览(33)
  • 微信小程序对接微信支付详细教程

    小程序 微信支付官方文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_11index=2 https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_0.shtml 前提 在进行对接微信支付之前,我们首先需要将以下几点准备好: 申请APPID 申请商户号 小程序开通微信支付,绑定已经申请好的商户号。

    2024年02月09日
    浏览(32)
  • h5 小程序 公众号 接入微信支付开发

    ps:一般公司开发不需要确认 流程:下单-调起支付-返回结果跳回本页面 开发准备: 1: 配置并授权项目地址(地址需要是完整的)(配置的是点击支付调起微信的那个本项目地址) 2: 获取code(为获取openid做准备) window.location.href= = \\\'https://open.weixin.qq.com/connect/oauth2/authorize?

    2024年02月15日
    浏览(47)
  • SpringBoot对接小程序微信支付

    目录 前言 一、准备工作 2.1、企业微信小程序开通 2.1.1、获取开发者ID 2.1.2、开通支付功能 2.1.3、关联商户号 2.2、企业商户号的开通 2.2.1、获取商户号mch_id 2.2.2、获取商户API密钥mch_key 二、整体流程 三、后端项目搭建 3.1、统一下单 3.2、支付支付回调 3.3、问题排查 3.4、统一下

    2024年02月04日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包