App中 微信分享 代付功能 业务设计 与 代码实现

先上图

在这里插入图片描述

场景

本例的代付场景是,开发一款APP应用,APP中具有支付能力,按照微信
支付对接要求已经完成APP支付的对接。现在要玩点新花样,找人代付订
单。用户在APP中下单后选择找人代付,将分享H5页面到微信中的好
友。好友在微信中打开H5页面,H5页面展示订单信息,并完成代付。

业务分析

代付功能在某些2C的应用中会用到,当然涉及支付的应用都可以有代付
功能。本文分析如何实现微信代付功能的技术设计。
根据微信支付的官方文档,微信支付对接支持JSAPI支付、APP支付、H5
支付、Native支付、小程序支付等,实际业务中应当根据使用的API类型
完成支付和代付功能设计。需要注意:微信没有代付接口,所谓的代付功
能实际是想微信发起支付API的对接。

还需要注意,微信支付对接在开发之前需要根据使用场景做接入准备,具
体可以阅读微信支付官方文档。

统一下单与支付

微信支付前需要先向微信发起“统一下单”,如果统一下单请求正常微信会返回预支
付ID,预支付id是支付接口需要用到参数。

有个原则,如果使用JSAPI拉起支付,则需要用JSAPI先发起“统一下
单”,如果使用APP支付,则需要先请求APP支付的统一下单。
不同的支付对接不同混用“统一下单”。

在微信内完成代付

大多数代付,是通过分享完成的。注意分享是第一步,也是比较重要的一步。
为什么很多代付是基于微信支付实现的,因为社交软件的特点催生了好友代付的需
求场景。

微信内支付

另外出于对后安全性的考虑,分享出去的页面只能在微信中打开。于是可以选择的
代付支付方式有:1.微信JSAPI支付:商户已有H5商城网站,用户通过消息或扫描二维码在微信内打开网页时。2.小程序支付:商户已有微信小程序,用户通过好友分享或扫描二维码在微信内打开小程序时,可以调用微信支付完成下单购买的流程。

微信外支付可以阅读微信H5支付文档。

交互

APP与后端交互:在订单下单,分享环节的设计主要围绕APP与后端系统的交互。H5与后端的交互:在分享完成后的,订单数据信息、用户数据信息的加载与展示,拉起支付等操作。设计上应当考虑H5页面对用户数据、订单数据的敏感性与安全性,这里主要考虑接口的匿名访问权限设计与跨域问题。用户分享H5页面出去后,实际需要在访问H5页面时通过Get请求携带一些不要的参数,为安全考虑参数应当在生成分享链接前加密处理。

安全性设计

	H5页面被浏览器渲染后,向后端请求用户数据和订单数据,后端必须进行安全性的校验。首先用户信息和订单数据信息敏感,但是根据代付的分享业务设计,还要具有可匿名访问和跨域的设计。1.跨域问题:将H5页面的访问地址固化,可在后端对H5页面中的匿名请求进行校验,注意Referer校验并不可靠,因为它可以伪造。2.请求签名:应当设计签名算法和逻辑,防止伪造。3.订单的“统一下单”一定要在后端实现4.参数先加密,不要存在明文参数,不要直接使用base64将明文参数进行编码,它不是加密算法。5.多次分享后的支付问题,同一笔订单支付一定要做后端的幂等处理。6.APP订单id与微信“统一下单”的预支付id一定要做数据库层面的逻辑关系绑定。

Java 后端与H5代码实现

  1. 开发H5分享代付页面
    由于分享功能是APP内实现的,H5页面实际是独立部署在后端服务器上的,对H5的访问实际是通过分享出去的访问链接地址在微信内部的浏览器打开的。
<html><head><style type="text/css"></style></head><script type="text/javascript">//假设H5代付页面访问地址:	http://h5.html?payId=xxxxxx加密串xx&sign=xx签名串xx//微信重定向后地址:		http://h5.html?payId=xxxxxx加密串xx&sign=xx签名串xx&CODE=XX微信返回XX//微信静默授权地址://https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect //1.如果用户第一次打开分享链接,没有CODE参数会向微信请求授权,微信会重定向回来,并携带微信给的CODE参数var code =getUrlParamByName('CODE');if(!code){window.location.href='https://open.weixin.qq.com/connect/oauth2/authorize?'+'appid=xxxxxAPPIDxxxxxxxx'+'&redirect_uri= ' //此H5页面访问地址+ "http://h5.html?payId=xxxxxx加密串xx&sign=xx签名串xx"//静默授权+'&response_type=code&scope=SCOPE&state=STATE#wechat_redirect';}//获取请求地址中的参数function getUrlParamByName(name){var query = window.location.search.substring(1);var vars = query.split("&");for (var i=0;i<vars.length;i++) {var pair = vars[i].split("=");if(pair[0] == name){return pair[1];}}return '';}//因为微信支付需要prepayId 预支付ID//所以需要后台先请求微信统一下单并返回预支付ID给前端function prepay(){$.ajax({url:'/后端统一下单接口',data:{//统一下单需要用户openId//后端根据code向微信换取openIdcode:code //后台用code获取用户openId},success:function(res){//后台返回的预支付IDvar prepayId = res.prepayId;//拉起微信支付weixinPay(prepayId);}});}//拉起微信支付function weixinPay(prepayId){//微信 JSAPI 、 H5 拉起支付代码,具体可参见微信开放平台示例:
WeixinJSBridge.invoke('getBrandWCPayRequest', {"appId": "wx2421b1c4370ec43b",     //公众号ID,由商户传入     "timeStamp": "1395712654",     //时间戳,自1970年以来的秒数     "nonceStr": "e61463f8efa94090b1f366cccfbbb444",      //随机串     "package": "prepay_id=up_wx21201855730335ac86f8c43d1889123400","signType": "RSA",     //微信签名方式:     "paySign": "oR9d8PuhnIc+YZ8cBHFCwfgpaK9gd7vaRvkYD7rthRAZ\/X+QBhcCYL21N7cHCTUxbQ+EAt6Uy+lwSN22f5YZvI45MLko8Pfso0jm46v5hqcVwrk6uddkGuT+Cdvu4WBqDzaDjnNa5UK3GfE1Wfl2gHxIIY5lLdUgWFts17D4WuolLLkiFZV+JSHMvH7eaLdT9N5GBovBwu5yYKUR7skR8Fu+LozcSqQixnlEZUfyE55feLOQTUYzLmR9pNtPbPsu6WVhbNHMS3Ss2+AehHvz+n64GDmXxbX++IOBvm2olHu3PsOUGRwhudhVf7UcGcunXt8cqNjKNqZLhLw4jq\/xDg==" //微信签名 },function(res) {if (res.err_msg == "get_brand_wcpay_request:ok") {// 使用以上方式判断前端返回,微信团队郑重提示://res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。}});}</script><body><div><span>好友 {{order.user.name}} 邀您代付 {{order.payAmount}}</span></div><div ><img src="{order.usr.photo}" alt="用户头像" /></div><div><ul><li v-for="item in order.orderItems"><img src="{item.photo}" alt="订单商品图片" /><span>{{item.productName}}</span><span>{{item.price}}</span><span>{{item.buyCount}}</span></li></ul></div><button id="payNow" click="prepay()">立即支付</button></body>
</html>
  1. 开发接口返回H5分享链接
    如果没有特殊要求,H5页面开发万后可以部署在服务器上作为静态资源对外提供访问,就是指任意用户都可以直接访问,知道页面访问地址都可以访问页面。
    如果安全一点的做法,就是将页面部署在受保护的服务中,要访问页面必须通过后端的校验之后才被返回,而无法直接通过地址直接发起对页面的请求。
    这里使用静态资源部署H5页面,这也是为什么可以在H5代码中向微信静默获取用户授权的请求参数 redirect_uri 写成H5页面访问地址的原因。
    如果H5是后台接口返回的话,redirect_uri 也要写成后台接口的地址。
/**
* APP获取H5代付,分享地址
* 此请求由APP内调用,非匿名接口
*/
@PostMapping
public Object appGetH5url(String orderId){//加密请求String payId = encrypt(PASSWORD,数据);//签名请求String url="http://h5.html?payId=xxxxxx加密串xx";String sign = MD5(url);return url+"&sign="+sign;
}
  1. 开发返回订单信息接口用于H5的订单与支付信息展示
H5 匿名接口,无需登录,要做好安全措施防止恶意请求和数据泄漏
/**
* H5请求支付订单信息
* @param data 待加密字符串
* @return 加密后内容
*/
@PostMapping
public Object queryOrder(String payId,String sign){//1.验证签名....if(checkSign(sign)==false){return "404.html";}//2.解密payIdMap<String,Object> param = decrypt(PASSWORD,payId);if(null==param){return "404.html";}String orderId= param.get("orderId");//查询订单数据后返回Order order = queryOrder(orderId);//订单状态,支付状态等 校验if(checkOrder(order)==false){return "404.html";}return	order;
}
  1. H5页面“立即支付”前,调用后端“统一下单”获取prePayId
/**
* H5立即支付,后台微信统一下单
*/
@PostMapping
public Object queryOrder(String payId,String sign,String code){//1.验证签名....if(checkSign(sign)==false){return "404.html";}//2.解密payIdMap<String,Object> param = decrypt(PASSWORD,payId);if(null==param){return "404.html";}//3.向微信换取openIdString openId = 请求微信API(code);String orderId= param.get("orderId");//查询订单数据后返回Order order = queryOrder(orderId);//订单状态,支付状态等 校验if(checkOrder(order)==false){return "404.html";}//4.想微信统一下单String prepayId = 请求微信统一下单(order,openId,....);return	prepayId;
}
  1. H5页面拉起微信支付
function weixinPay() {WeixinJSBridge.invoke('getBrandWCPayRequest', {"appId": "wx2421b1c4370ec43b",     //公众号ID,由商户传入     "timeStamp": "1395712654",     //时间戳,自1970年以来的秒数     "nonceStr": "e61463f8efa94090b1f366cccfbbb444",      //随机串     "package": "prepay_id=up_wx21201855730335ac86f8c43d1889123400","signType": "RSA",     //微信签名方式:     "paySign": "oR9d8PuhnIc+YZ8cBHFCwfgpaK9gd7vaRvkYD7rthRAZ\/X+QBhcCYL21N7cHCTUxbQ+EAt6Uy+lwSN22f5YZvI45MLko8Pfso0jm46v5hqcVwrk6uddkGuT+Cdvu4WBqDzaDjnNa5UK3GfE1Wfl2gHxIIY5lLdUgWFts17D4WuolLLkiFZV+JSHMvH7eaLdT9N5GBovBwu5yYKUR7skR8Fu+LozcSqQixnlEZUfyE55feLOQTUYzLmR9pNtPbPsu6WVhbNHMS3Ss2+AehHvz+n64GDmXxbX++IOBvm2olHu3PsOUGRwhudhVf7UcGcunXt8cqNjKNqZLhLw4jq\/xDg==" //微信签名 },function(res) {if (res.err_msg == "get_brand_wcpay_request:ok") {// 使用以上方式判断前端返回,微信团队郑重提示://res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。}});
}
  1. 后端微信回调接口
/**
* 微信支付回调
*/
@PostMapping("/微信回调通知接口")
public void weichatNotify(){//判断支付结果,更新订单状态。。。
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34765.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代付系统/代付系统源码/支付宝代付系统/API代付系统

简介&#xff1a; 其他站买的&#xff0c;没有做测试&#xff0c;源码是JAVA的&#xff0c;附带了安装文档&#xff0c;需要的拿无售后 源码下载地址https://www.skpan.cn/2QnIARSZDxG 代付系统/代付系统源码/支付宝代付系统/API代付系统 系统流程: 后台开通代理——开通商户…

代付系统开发(搭建)【支付宝自动代付】

本系统独立自主研发&#xff0c;集收付款一体&#xff0c;支持对接第4方。多年支付风险控制经验确保系统安全稳定运行。 【全自动代付系统开发UI和搭建思路及优化】 本系统提供多种支付通道但仅演示当前能稳定使用的通道&#xff0c;并保证交付源码与演示一致。后续因官方问题…

微信支付——委托代扣介绍

目录 1、定义 2、应用场景 3、申请条件 *基础条件 *资质条件 4、业务类型说明 5、开通流程 6、支付中签约 7、签约后支付 8、服务商开通样例 由于委托代扣开通需要较高的权限&#xff0c;有其他问题可私聊小编或进Q群交流&#xff1a;565014741&#xff0c;看到您的留…

代扣代收 VS 代付代发

陆续的也提过一些支付领域的概念和词汇,“代扣/代收,代付/代发”这四个专业名词确实不容易让人理解和区分,说者和听者容易搞混,今天换个思路学习下。 1. 两类账户 对于银行来说,账户种类繁琐:公司的,个人的,一类账户,二类账户,存储账户,借贷账户,等等。对于我们理…

第三方支付和代付区别在哪?

对于分账和代付两个词汇&#xff0c;对于许多电商平台经营者来说并不陌生。但要深入研究&#xff0c;却鲜少有人知道这两个词汇的区别。 代付 代付分为第三方支付公司代付和银行代付&#xff1a; 第三方支付公司代付。 对于绝大部分电商平台都会有代付的需求。如收取用户资…

微信支付代付通道开通流程

提供企业向用户付款的功能&#xff0c;支持企业通过API接口付款&#xff0c;或通过微信支付商户平台网页功能操作付款。 开通 开通条件&#xff1a; 1、商户号已入驻90日 2、商户号有30天连续正常交易 3、 登录微信支付商户平台-产品中心&#xff0c;开通企业付款。 充值 登录微…

涉及到第三方支付接口该如何测试?

现在有不少测试朋友做的项目中&#xff0c;可能也会涉及到支付相关的功能。比如&#xff1a;做商城的&#xff0c;做游戏的以及其他在线交易的网站、APP等。如果支付出了问题&#xff0c;或者用户拿少的钱通过篡改请求数据购买大金额的商品&#xff0c;如果是实物的话&#xff…

好友代付系统

心血来潮&#xff0c;和大家分享一个我同学正在操作的项目。收益不输金领&#xff0c;令人艳羡&#xff0c;让我给大伙讲讲我这个同学做什么项目。 这位同学做的事仿制美团饿了么平台的好友代付系统&#xff0c;虚拟经营。当然也可以实体经营&#xff0c;线下经营。只不过二者差…

AI仿写软件-仿写文章生成器

AI仿写软件&#xff1a;高效出色的营销利器 作为互联网时代的营销人员&#xff0c;我们不仅需要品牌意识&#xff0c;还必须深谙营销技巧。万恶的时限压力使得我们不得不在有限的时间内输出更多的文本内容&#xff0c;以便吸引更多的关注。那么&#xff0c;如何解决这个问题呢…

chatgpt赋能python:Python和Selenium在SEO中的应用

Python和Selenium在SEO中的应用 在当今的数字时代&#xff0c;搜索引擎优化已成为所有在线业务的必要部分。随着业务的发展和市场的需求&#xff0c;如何将网站的排名提高至关重要&#xff0c;SEO已成为每个网站所有者的标配。 Python作为一种强大的脚本语言&#xff0c;可以…

算力分析及相关查询网站

1、FLOPS定义 FLOPS是“每秒所执行的浮点运算次数”&#xff08;floating-point operations per second&#xff09;的缩写。它常被用来估算电脑的执行效能&#xff0c;尤其是在使用到大量浮点运算的科学计算领域中。 在这里所谓的“浮点运算”&#xff0c;实际上包括了所有涉…

Chiplet:大算力的翅膀

作者简介&#xff1a;Erick.X&#xff0c;复睿微首席架构专家。 Chiplet 概述 过去几十年来&#xff0c;半导体行业一直按照摩尔定律的规律发展&#xff0c;凭借着芯片制造工艺的迭代&#xff0c;使得每18个月芯片性能提升一倍。但是当工艺演进到5nm&#xff0c;3nm节点&…

ChatGPT 也解决不了 “老婆和老妈掉河里先救谁” 的难题?

据网络报道&#xff0c;4月26日&#xff0c;中国政法大学刑事司法学院教授罗翔在华南师大附中公开讲座&#xff0c;提到当下很火的ChatGPT&#xff0c;罗翔说&#xff1a;“很多人都跟我说&#xff0c;你现在要开始学习ChatGPT&#xff0c;否则2年以后就会被淘汰。我当然也开始…

任正非接受采访首谈ChatGPT:我跟大家看法,有些不一样...

近日&#xff0c;任正非在接受采访时说&#xff1a;“ChatGPT对我们的机会是什么&#xff1f;它会把管道流量撑大&#xff0c;这样我们的5G产品就有市场需求。” 任总还强调&#xff1a;“今后职场上只有两种人&#xff0c;一种是熟练使用AI的人&#xff0c;另一种是创造AI工具…

用强化学习玩《超级马里奥》

Pytorch的一个强化的学习教程&#xff08; Train a Mario-playing RL Agent&#xff09;使用超级玛丽游戏来学习双Q网络(强化学习的一种类型)&#xff0c;官网的文章只有代码&#xff0c; 所以本文将配合官网网站的教程详细介绍它是如何工作的&#xff0c;以及如何将它们应用到…

新功能提醒:Midjourney v5.2 已发布!

您准备好踏上艺术与人工智能相遇的视觉之旅了吗&#xff1f;介绍 Midjourney V5.2&#xff0c;这是突破性 AI 艺术工具的最新版本&#xff0c;只需一个文本提示即可将您的想象力变为现实。凭借其卓越的功能和一系列新功能&#xff0c;Midjourney V5.2彻底改变了您轻松创建令人惊…

拉上谷歌高通 三星围攻苹果

时隔4年&#xff0c;三星又在VR领域出手了。 在几天前的新品发布会上&#xff0c;三星宣布正在开发新的XR&#xff08;扩展现实&#xff09;产品和体验&#xff0c;为提高产品竞争力&#xff0c;三星找来了谷歌和高通两大“帮手”&#xff0c;前者提供生态系统和软件支持&…

Uniapp+SpringBoot即时通讯聊天安卓APP源码_全开源

Uniapp SpringBoot即时通讯聊天安卓APP源码_完全开源。 前端使用uniapp&#xff0c;后端使用SpringBoot。 移动端使用uniapp实现。 目前仅支持Android、iOS和H5终端。 后期会继续适配小程序终端、桌面终端&#xff08;windows、mac&#xff09;和web终端。 使用的技术&#x…

股票筛选。如何查找股票?如何查找潜力股?

网址 &#xff1a; http://www.czc123.top/mytools/codeSearch.php 沪深A总共有3700多只股票&#xff0c;一只只股票去看肯定不现实&#xff0c;这时候就需要一个股票筛选的工具。 最近一直想找一款股票查询的工具&#xff0c;可是世面上有的不是收费的&#xff0c;就是不满足…

购买高分红股票是不是一个好的投资策略?

购买高分红&#xff08;High Dividend&#xff09;股票&#xff0c;是一个受到很多投资者追捧的投资策略。今天这篇文章&#xff0c;就来帮助大家好好分析一下这样的投资方法。 首先&#xff0c;我们不妨想一下这个问题&#xff1a;为什么有那么多人喜欢高分红股票&#xff1f;…