ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

支付宝&微信个人收款支付系统解决方案

2021-11-21 10:30:17  阅读:324  来源: 互联网

标签:支付宝 微信 APP 参数 支付 字符串 type price 收款


原文链接
对于个人收款支付系统,由于没有营业执照,微信、支付宝官方提供的接口无法使用,个人二维码收款又无法完成支付系统后续工作,这个问题一直以来都没有找到一个适合的解决方案。经过不断尝试,最终找到了一个非常好用的第三方工具来解决这个问题——GOGO支付,提供API接口,支付成功可回调接口。

GOGO支付简介

GOGO支付是一款个人收款服务平台,使用前需要注册使用,会给APP_ID和APP_SECRET,默认是体验版,免费使用。后续不需要提供任何个人信息,无需担心任何个人信息泄露问题。缺点就是免费体验版需要自主配置监控端挂机,就是在手机上安装一个APP,这与它的工作原理有关。

工作原理

首先,需要在手机上安装GOGO提供的APP,然后APP会监测支付宝和微信的收款消息,这步需要用户在手机上提供权限。

用户在GOGO后台配置服务端信息,如下图,异步回调会在用户支付成功后由GOGO后端发送POST请求到配置的接口上,需要写代码验证,验证成功返回success即可。同步回调会在用户支付成功的同时直接跳转页面到配置的指定链接。

当用户通过扫码支付正确金额后,会通过监控端APP检测支付宝或微信是否收到相应款数,当确认到收款金额无误GOGO后端会触发回调,回调会发送到用户配置的回调接口上,此时一次支付过程结束。

配置收款码

除了基本的一些系统配置可以自定义调整外,在商户后台必须要配置好收款二维码。至少添加任意金额的微信收款码和支付宝收款码各一张,才能正常使用微信支付和支付宝支付。

  • 支持使用固定金额的收款二维码,无需客户输入金额。
  • 支持多个收款码自动切换轮询,避免收款码失效。

API接入

这里就介绍两个比较重要的API,其余API请查看API文档

创建订单

  • 请求地址:https://www.gogozhifu.com/createOrder
  • 请求方式:POST/GET
  • 参数说明:
参数参数类型参数说明
payId字符串【必传】商户订单号,可以是时间戳,不可重复
type整数【必传】微信支付传入1 支付宝支付传入2
price字符串【必传】订单金额,保留两位小数的字符串,例如“1.00”
sign字符串【必传】签名,计算方式为将各个参数按顺序拼接后用md5加密, md5(APPID+payId+param+type+price+APPSECRET)
param字符串【可选】传输参数,将会原样返回到异步和同步通知接口
isHtml整数【可选】传入1则自动跳转到支付页面,否则返回创建结果的json数据
notifyUrl字符串【可选】传入则设置该订单的异步通知接口为该参数,不传或传空则使用后台设置的接口
returnUrl字符串【可选】传入则设置该订单的同步跳转接口为该参数,不传或传空则使用后台设置的接口
title字符串【可选】订单主题、类型,之后可根据该值统计分析数据,最多10个字符
content字符串【可选】描述订单具体内容、备注等说明文字
returnParam整数【可选】默认是0,传1即可让官方支付页跳转returnUrl带上回调通知的参数
  • 返回数据(示例): {“code”:1,“msg”:“成功”,“data”:{“payId”:“1547129707139”,“orderId”:“201901102220147500”,“payType”:2,“price”:0.1,“reallyPrice”:0.1,“payUrl”:“HTTPS://QR.ALIPAY.COM/FKX03500Z2ZYWA0ELYU123”,“isAuto”:1,“state”:0,“timeOut”:5,“date”:1547130014}}
  • 返回数据说明:
参数参数类型参数说明
code整数返回代码(1:成功,0:调用失败)
msg字符串api调用结果说明
data数组api调用结果(如果code为0,则data为null)
  • data数据说明
返回参数参数类型参数说明
payId字符串商户订单号
orderId字符串云端订单号,可用于查询订单是否支付成功
payType整数微信支付为1 支付宝支付为2
price字符串订单金额,保留两位小数的字符串,例如1.00
reallyPrice字符串实际需付金额,保留两位小数的字符串,例如1.00
payUrl字符串支付二维码内容
isAuto整数1需要手动输入金额 0扫码后自动输入金额
state整数订单状态:-1 订单过期 0 等待支付 1 完成 2 支付完成但通知失败
timeOut整数订单有效时间(分钟)
date长整数订单创建时间时间戳(10位)

Python请求示例:

def getOrderInfo(pay_id, p_type, price, content, notifyUrl=None, returnUrl=None):
	param = 'Quanfita'
	print(str(APP_ID+pay_id+p_type+price+APP_SECRET))
	data = {
		"payId": pay_id,
		"type": p_type,
		"price": price,
		"param": param,
		'isHtml' : 1,
		'sign': hashlib.md5(str(APP_ID+pay_id+param+p_type+price+APP_SECRET).encode(encoding='UTF-8')).hexdigest(),
		'content': content
	}
	if notifyUrl is not None:
		data['notifyUrl'] = notifyUrl
	if returnUrl is not None:
		data['returnUrl'] = returnUrl
	headers = {
		"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44",
		"content-type": "application/json",
		"charset": "utf-8",
		"App-Id": APP_ID,
		"App-Secret": APP_SECRET
	}
	response = requests.post(BASE_URL,json=data,headers=headers)
	res = response.text
	print(data)
	print(res)
	# 存储数据
	return res

回调通知

  • 传输参数(示例):payId=1547130349673&param=gump994&type=2&price=0.10&reallyPrice=0.10&sign=28943820b95019b6a63598a13c46f93f
  • 参数获取:同时支持GET和POST方式获取回调的参数
  • 传输参数说明:
返回参数参数类型参数说明
payId字符串商户订单号
param字符串创建订单的时候传入的参数
type整数支付方式 :微信支付为1 支付宝支付为2
price字符串订单金额,保留两位小数的字符串,例如1.00
reallyPrice字符串实际支付金额,保留两位小数的字符串,例如1.00
sign字符串校验签名,计算方式为对各个参数按顺序拼接后的字符串用md5加密, md5(APPID + payId + param + type + price + reallyPrice + APPSECRET)

Python回调示例:

def checkCallback(pay_id, param, p_type, price, reallyPrice, sign):
	if hashlib.md5(str(APP_ID+pay_id+param+p_type+price+reallyPrice+APP_SECRET).encode(encoding='UTF-8')).hexdigest() == sign:
		return True
	else:
		return False

def CallbackView(request):
	if request.method == 'POST':
		pay_id = request.GET.get('payId')
		param = request.GET.get('param')
		p_type = request.GET.get('type')
		price = request.GET.get('price')
		reallyPrice = request.GET.get('reallyPrice')
		sign = request.GET.get('sign')
		if checkCallback(pay_id, param, p_type, price, reallyPrice, sign):
			return HttpResponse("success")
		else:
			HttpResponse("Failed", 403)
	return HttpResponse("Failed", 403)

总结

目前,大多数个人收款解决方案都是使用这类监听端+服务端的方式来运行的,局限性也很大,期待将来能够找到更好的方案。

原文链接:https://quanfita.cn/article/gogo_pay/
个人博客:https://quanfita.cn

标签:支付宝,微信,APP,参数,支付,字符串,type,price,收款
来源: https://blog.csdn.net/qq_30611601/article/details/121428912

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有