关于微信支付:淘宝支持微信支付

大家好,我是小悟 淘宝订单能够微信领取了,真是好消息。据说目前局部淘宝订单曾经能够反对微信领取。 微信领取目前仅针对局部用户逐渐凋谢,且仅反对购买局部商品时可抉择。 这一音讯在电商行业引起了不小的触动。这意味着消费者在淘宝上购物时,行将能够间接应用微信领取,而无需跳转到其余平台进行领取。 这一性能一旦推出,不仅不便了消费者,也为淘宝带来了更多的用户和交易量。 对于消费者来说,淘宝能够反对微信领取意味着购物更加便捷。只须要在淘宝上抉择商品,而后抉择微信领取形式,即可实现领取。 这种领取形式的便利性,无疑会吸引更多的消费者抉择在淘宝上购物。 同时,淘宝反对微信领取也有助于进步淘宝的竞争力。在电商行业日益竞争强烈的背景下,淘宝须要不断创新和欠缺本身服务,以吸引更多用户。 而反对微信领取,正是淘宝晋升用户体验和服务质量的重要动作之一。 当然,对于微信来说,与淘宝的单干也有着踊跃的意义。微信领取作为国内当先的挪动领取形式之一,与淘宝的单干将有助于扩充其领取场景和利用范畴。 同时,这也将进一步推动挪动领取的遍及和倒退。 用户能够在淘宝上抉择微信领取作为领取形式,享受更加便捷的购物体验。这对于用户来说,无疑是一个好消息。 在应用淘宝的过程中,用户不再须要为了领取问题而来到淘宝平台。同时,这也意味着淘宝和微信两大平台的单干迈出了新的一步,将为用户带来更多的便当和抉择。 总之,淘宝反对微信领取是一个双赢的单干。它不仅不便了消费者购物,进步了淘宝的竞争力,也有助于推动挪动领取的遍及和倒退。 将来,期待看到更多的电商平台和领取形式相互支持,独特推动电商行业的倒退和凋敝。 您的一键三连,是我更新的最大能源,谢谢 山水有相逢,来日皆可期,谢谢浏览,咱们再会 我手中的金箍棒,上能通天,下能探海

February 22, 2024 · 1 min · jiezi

关于微信支付:微信小程序支付

当下,微信小程序非常火爆,当初无论是购物还是生存服务,都是举荐你应用微信小程序,次要是它无需下载安装就能够应用,让手机变得十分清新,给用户也带来很大的不便之处。 明天给大家分享的是,微信小程序 API v3 领取。 目录1、成果演示2、微信小程序领取官网文档3、生成密钥、生成证书4、如何生成签名5、微信小程序下单接口6、微信小程序商户订单查问接口 一、成果演示步骤1:用户抉择好商品,提交订单,服务端下预订单 步骤2:小程序端拉起领取控件,并实现领取 步骤3:查问领取后果 步骤4:实现领取,显示领取后果 二、微信小程序领取官网文档2.1 API v3 密钥2.2 如何生成申请签名2.3 小程序下单接口2.4 商户订单号查问订单接口三、生成明码,生成证书看 【2.1】文档,生成 API v3 密钥 和 API 证书。 留神: 1、生成证书,须要配合客户端软件(WXCertUtil)生成。2、附件中的三份文件(证书pkcs12格局、证书pem格局、证书密钥pem格局)。倡议读一读 证书应用阐明.txt。 四、生成签名这一步是相当简单,咱们肯定要把【2.2】文档多读几遍。 先说论断,这一步次要是构建上面这样一个货色: Authorization: 认证类型 签名信息认证类型是 WECHATPAY2-SHA256-RSA2048。 签名信息: 发动申请的商户(包含直连商户、服务商或渠道商)的商户号mchid商户API证书序列号serial_no,用于申明所应用的证书申请随机串nonce_str工夫戳timestamp签名值signature商户号 mchid,这个拿到了。商户API证书序列号serial_no,这个有两种形式,一是从证书(p12)文件中获取,二是在后盾查看:【API平安 > 申请API证书 > 点击“治理证书” > “证书序列号”】 上面就来重点说一下这个签名了。 格局: HTTP申请办法\nURL\n申请工夫戳\n申请随机串\n申请报文主体\nHTTP申请办法,每个接口都不一样,比方下单接口是POST,查问接口是GET。 URL,这是是除去域名,前面的全副。官网文档是这样说的: 第二步,获取申请的相对URL,并去除域名局部失去参加签名的URL。如果申请中有查问参数,URL开端应附加有'?'和对应的查问字符串。申请工夫戳,这个是秒数。 接口报文体,官网也说的比拟具体, 第五步,获取申请中的申请报文主体(request body)。申请办法为GET时,报文主体为空。当申请办法为POST或PUT时,请应用实在发送的JSON报文。图片上传API,请应用meta对应的JSON报文。对于下载证书的接口来说,申请报文主体是一个空串。综合起来,就是这样的,举个例子: GET\n /v3/certificates\n 1554208460\n 593BEC0C930BF1AFEB40B4A08C8FB242\n \n下一个难点来了,计算签名。 签名形式:应用商户私钥看待签名串进行SHA256 with RSA签名,并对签名后果进行Base64编码失去签名值。 简略来说,1:就是先要读到商户私钥,2:而后应用私钥进行SHA256 with RSA签名,3:Base64编码 到这里,就算失去 Authorization 的值了。 五、微信小程序下单接口上面咱们就以小程序下单接口来做阐明。 ...

September 10, 2023 · 3 min · jiezi

关于微信支付:自动处理微信消费者投诉管理系统配置指南

大家好,我是小悟 曾经有小伙伴开始应用主动解决【微信消费者投诉管理系统】,所以具体介绍一下如何配置。 浏览这篇文章之前,联合这篇【连夜干进去一个主动解决【微信消费者投诉管理系统】,反对多商户】干货食用更佳。 1、商户信息 商户名称:商户号所属的商户简称。 商户号:微信领取商户平台-账户核心-商户信息-微信领取商户号。 商户平台apiV3密钥:微信领取商户平台-账户核心-API平安-设置APIv3密钥。 商户appId:微信领取商户平台-产品核心-AppID账号治理-我关联的AppID账号。 商户API证书序列号:微信领取商户平台-账户核心-API平安-申请API证书-治理证书-API证书治理。 商户API证书地位门路:把API证书下载下来会有三个证书文件,把apiclient_key.pem证书上传服务器,复制证书所在位置门路即可。 微信领取平台证书序列号:须要代码生成。 微信领取平台证书地位门路:须要代码生成该证书后搁置服务器。 新增商户信息后,要选中该商户,而后点击增加投诉地址,提醒操作胜利。这是很重要的一个步骤,只有这个操作胜利了,零碎才会收到微信的回调。 2、告诉参数 邮箱告诉参数配置 发送人邮箱:注册一个163邮箱用来当发送方。 发送人邮箱受权码:登录发送人163邮箱账号-设置-POP3/SMTP/IMAP-开启IMAP/SMTP服务和新增受权明码。 接管人邮箱:这个就是用来接管投诉单告诉的接管人邮箱,能够不肯定是163邮箱。 公众号告诉参数配置 公众号appId:公众号后盾-设置与开发-根本配置-公众号开发信息-开发者ID(AppID)。 公众号secret:公众号后盾-设置与开发-根本配置-公众号开发信息-开发者明码(AppSecret)。 公众号模板音讯id:公众号后盾-广告与服务-模板音讯-从历史模板库增加,所在行业要有【IT科技/互联网|电子商务】,而后搜寻增加如下这个模板音讯。 接管人公众号openId:这个就是用来接管投诉单告诉的接管人公众号openId。公众号后盾-内容与互动-用户治理,找到要设置为接管人的用户,而后右击头像地位,点击“查看”,就能够进去开发者模式,data-fakeid后边的值就是用户的openId。 短信告诉参数配置 腾讯云短信secretId:腾讯云后盾-拜访治理-API密钥治理。 腾讯云短信secretKey:腾讯云后盾-拜访治理-API密钥治理。 腾讯云短信模板id:腾讯云后盾-短信-注释模板治理。 腾讯云短信appId:腾讯云后盾-短信-利用列表-利用设置。 腾讯云短信签名:腾讯云后盾-短信-签名治理。 接管人手机号:这个就是用来接管投诉单告诉的接管人手机号。 您的一键三连,是我更新的最大能源,谢谢 山水有相逢,来日皆可期,谢谢浏览,咱们再会 我手中的金箍棒,上能通天,下能探海

April 6, 2023 · 1 min · jiezi

关于微信支付:连夜干出来一个自动处理微信消费者投诉管理系统支持多商户

大家好,我是小悟 1、问题背景 玩过微信领取生态的,或者就有这种感触,如果收到投诉单,不会告诉到手机端,只会在微信领取商户后盾-账户核心-消费者投诉那里显示。那你能始终盯着电脑看吗?可能当你有空关上电脑登录查看的时候,曾经积攒了好多超时未解决的投诉单。 一旦解决不及时,超时什么的,就会受到处罚,比方调整结算周期、敞开主动提现等等。这个时候找不到人工客服,客服电话永远没人接。提交申诉,一周就过来了,工夫节约了不说,照样给你维持原判,不带说起因的。欲哭无泪,找谁说理去。 正好有小伙伴征询说能够搞个消费者投诉解决零碎吗?当然能够。 所以还是搞个零碎来解决,起码会比拟及时的解决投诉单。废话不多说,来看一下这个零碎。 2、商户信息 这里录入的是商户号相干信息,能够新增多个商户号,治理起来也不麻烦,挺不便。 要筹备商户名称、商户平台apiV3密钥、商户号、商户appid、商户API证书序列号、微信领取平台证书序列号、商户API证书地位门路、微信领取平台证书地位门路,这些参数信息到微信领取商户后盾获取。 当零碎在收到用户投诉时会主动回复,回复的内容就是获取的【商户回复用户内容】字段的值,所以,这个字段填写的内容要敌对、客气、礼貌一点,毕竟,客户可是上帝哦。 如果开启了主动退款,零碎收到投诉单后,也会主动退款,而后将投诉单状态改为已解决实现。 如果将状态改为禁用,则零碎不会收到投诉单告诉。 3、告诉参数 这个配置的是音讯告诉参数,如果商户号被投诉了,零碎收到投诉单时,会告诉接管人。有三种告诉渠道,邮箱告诉、公众号告诉、短信告诉,任选其一。 邮箱告诉须要设置发送人邮箱(必须是网易云163邮箱)、发送人邮箱受权码、接管人邮箱。这些须要到网易云163邮箱后盾获取。 公众号告诉须要设置公众号appId、公众号secret、公众号模板音讯id、接管人公众号openId。这些须要到公众号后盾获取。 短信告诉须要设置腾讯云短信secretId、腾讯云短信secretKey、腾讯云短信模板id、腾讯云短信appId。这些须要到腾讯云后盾获取。 您的一键三连,是我更新的最大能源,谢谢 山水有相逢,来日皆可期,谢谢浏览,咱们再会 我手中的金箍棒,上能通天,下能探海

March 19, 2023 · 1 min · jiezi

关于微信支付:电商收付通商户进件上传身份证营业执照自动识别相关信息

作为开发者,当然心愿开发的零碎,对使用者可能更敌对,应用的越简略,越不便越好,缩短工作工夫,提高效率。也能够说是一种应用体验,体验成果越好那当然阐明零碎越棒了。 二级商户进件的时候,须要提交的材料不少,有一个繁琐的中央就是,不论抉择哪种主体类型,都须要上传身份证人像面、身份证国徽面、身份证姓名、身份证号码、身份证寓居地址、身份证开始工夫和身份证完结工夫这些因素。 如果主体类型是企业或者个体户,还须要上传营业执照、营业执照注册号、商户名称和经营者/法定代表人姓名这几个因素。 除了照片是须要上传外,其余因素都是手动填写的,既容易出错又浪费时间。解决问题的办法就是自动识别。 为了进步进件效率,在进件提交性能上做了优化,优化内容如下。 1、在上传身份证人像面后,自动识别出身份证姓名、身份证号码和身份证寓居地址并主动填充显示,无需手动填写。 2、在上传身份证国徽面后,自动识别出身份证开始工夫和身份证完结工夫并主动填充显示,无需手动填写。 3、在上传营业执照后,自动识别出营业执照注册号、商户名称和经营者/法定代表人姓名并主动填充显示,无需手动填写。 通过后盾设置参数,随时批改,立刻失效。 上传身份证、营业执照自动识别相干信息性能已实现,节省时间,缩小手动填写可能呈现的谬误,整体加强零碎应用体验和进步零碎进件效率。 收付通在手,生意你有。 电商收付通,商户进件,上传身份证、营业执照自动识别相干信息 山水有相逢,来日皆可期,谢谢浏览,咱们再会 我手中的金箍棒,上能通天,下能探海 上一篇:源码被倒卖,文章被剽窃,有点意思

September 10, 2022 · 1 min · jiezi

关于微信支付:源码被倒卖文章被抄袭有点意思

说来这事也搞笑,素来没想过,源码会被倒卖,文章会被剽窃,这事,说来还挺有戏剧性。 对于电商收付通管理系统,这个是曾经获得了中国版权保护核心计算机软件著作权注销证书,代码都曾经提交备案入库。以下截图是中国版权保护核心后盾注销记录截图。 特此申明:本软件或源代码仅可用于学习等非法合规的用处,禁止将本软件或源代码用于任何非法用处,造成任何不良的所有结果,与自己无关,应用即认同以上准则。 开发的零碎基本上都会申请软著注销证书。事实上,倡议所有的开发者都应该给本人开发的零碎申请软著注销,给原创给予爱护。所以不论遇到倒卖什么样的软件源码,都要说不,省的遇到法律问题,花了钱还给本人惹得一身骚。 大部分信息是小伙伴告知于我,有人在做这样不遵守规则的事件,小伙伴堪比向阳大众哈,嘿嘿,感激他们。 先说倒卖源码,有天小伙伴和我说在网上看到有人在售卖收付通零碎源码,和我的这个截然不同,于是就按他发的链接去看了下。好家伙,果然是截然不同的。上面这些就是倒卖的人公布的内容,截几张图看一下,高深莫测。 商品介绍 零碎截图 于是我加上了客服QQ号和微信,和他畅聊了一番,问他有没有演示体验的,当他发了他所谓的演示站地址给我后,这一看,这不是我本人的演示站吗,着实毁了我三观。。。 再问他是否是他们原创开发、是否会存在侵权问题,居然答复说不会,搞笑了。。。 独一无二,再说另外一个,这个也是另外一个小伙伴通知我的,于是我又加上了这个人微信,向他要演示站,而后他发过来地址,还是那个我本人的演示地址,三观再次尽毁。。。 同样的问题,问他源码是不是他们本人开发的,居然说是的,正在吐血中。。。 这种侵权行为不可任其助长,心愿大家独特监督,尊重原创作者的劳动成果。已提供软著等证据对其进行举报,平台也已通过,已封禁下架解决。 对于倒卖源码的行为,将保留证据,保留依法追究责任的权力。软著都有提交代码,一比照就晓得谁是原创。其实也分明是哪位大神做的这种事件,心愿有所收敛。 再说文章剽窃,不用说,也是小伙伴发给我的一篇文章。我一看,我去,文章也被剽窃了,于是间接提供证据投诉,投诉通过,剽窃文章曾经被删文解决了。 我本人在另外的网站也发现被剽窃,于是也是间接上传证据投诉,后果不用说,天然是通过了,剽窃的文章曾经被删除。 文章IP属地都一样,我想应该是同一个人的操作。别的不想多说,就想再说一句,不管怎样,也是辛辛苦苦做的货色,同是互联网人,规劝倒卖源码剽窃文章的人,请适可而止,请尊重原创的劳动成果,谢谢。 源码被倒卖,文章被剽窃,有点意思 山水有相逢,来日皆可期,谢谢浏览,咱们再会 我手中的金箍棒,上能通天,下能探海 上一篇:一张收款码,同时反对微信、云闪付、支付宝、信用卡领取

August 31, 2022 · 1 min · jiezi

关于微信支付:微信支付APIv3版平台证书可视化下载工具

微信领取相干接口降级为APIv3版本, 相较于之前的微信领取API,次要区别是: 遵循对立的REST的设计格调, 应用JSON作为数据交互的格局,不再应用XML, 应用基于非对称密钥的SHA256-RSA的数字签名算法,不再应用MD5或HMAC-SHA256, 不再要求携带HTTPS客户端证书(仅需携带证书序列号), 应用AES-256-GCM,对回调中的要害信息进行加密爱护。 开发者须要通过接口下载微信领取平台证书,微信领取平台证书的作用次要有两个, 一是验证微信应答或回调签名的正确性,以确保应答或回调是由微信领取发送。 二是为了保障通信过程中敏感信息字段(如用户的住址、银行卡号、手机号码等)的机密性,微信领取API v3要求商户对上送的敏感信息字段进行加密。这样只有领有私钥的微信领取能力对密文进行解密,从而保障了信息的机密性。 所有用到APIv3版本的微信领取接口都须要应用平台证书,电商收付通作为微信领取的核心内容也不例外。都须要调用接口来下载,这样极其不不便,于是就做了一个可视化下载平台证书的工具。 只须要填写商户号、商户APIv3密钥、 商户API证书序列号、 商户API证书(apiclient_key.pem)就能够下载微信领取平台证书。证书接管邮箱是用来接管创立好的证书和证书序列号,会主动发送,所以请确保邮箱填写正确。 为了参数平安起见,微信领取平台证书生成胜利后,请到商户后盾更换商户API证书和API证书序列号或者批改APIv3密钥。API证书、API证书序列号或者APIv3密钥变动不会影响之前生成好的平台证书。 微信领取APIv3版,平台证书可视化下载工具 山水有相逢,来日皆可期,谢谢浏览,咱们再会 我手中的金箍棒,上能通天,下能探海 上一篇:电商收付通,公众号H5合单领取同步存储openId

August 18, 2022 · 1 min · jiezi

关于微信支付:推荐一个好用的微信支付宝等Rust三方服务框架

说在后面明天给大家举荐一个Rust的自研三方框架Labrador,外面封装了淘宝客、京东联盟、微信领取、微信公众号、支付宝领取以及拼多多等API。尽管外面的API还有待欠缺,然而基础设施曾经有了,前面就是有条件的往上面堆API了。 很多人对淘宝客感兴趣,这个咱们下次再聊;当初咱们以对接微信以及支付宝领取为例子,看看应用这个框架都须要做多少工作吧! 筹备工作想要对接支付宝、微信,首先咱们须要在对应开放平台中申请所须要的参数。这里不再赘述,间接贴上目前自研平台的领取配置截图:支付宝微信 以上就是咱们须要提前准备好的工作。而后咱们须要新建一个工程 cargo new pay_test而后编辑Cargo.toml引入Labrador库。labrador = {version="0.1.0", features=["wechat", "alipay"]} 在main文件中,咱们先初始化两个client。 use labrador::{WeChatPayClient, SimpleStorage, TradeType, WeChatPayRequestV3, Amount, Payer, AlipayTradeWapPayRequest, AlipayClient};use chrono::{Local, SecondsFormat};#[tokio::main]async fn main() { // 微信 ↓ let wechat = WeChatPayClient::new("appid", "secret", SimpleStorage::new()).key_v3("api_v3_key").private_key("private_key"); let mut wechat_client = client.wxpay(); // 采纳V3版本的微信对立下单API let result = client.unified_order_v3(TradeType::Jsapi, WeChatPayRequestV3 { appid: "appid".to_string().into(), mch_id: "mchid".to_string(), description: "测试商品领取".to_string(), out_trade_no: "1602920235sdfsdfas32234234".to_string(), time_expire: Local::now().to_rfc3339_opts(SecondsFormat::Secs, false), attach: None, notify_url: "https:xxx.cn/trade/notify".to_string(), amount: Amount { total: 1, currency: String::from("CNY").into(), payer_total: None, payer_currency: None }, payer: Payer { openid: "oUVZc6S_uGx3bsNPUA-davo4Dt7Us".to_string() }.into(), detail: None, scene_info: None, settle_info: None }); match result.await { Ok(res) => { todo!(做一些平凡的事件) } Err(err) => { todo!(做一些平凡的事件) } } // 支付宝 ↓ let param = AlipayTradeWapPayRequest::default(); // 申请参数补全 let alipay_client = AlipayClient::new("appKey", false).set_private_key("private_key")? .set_alipay_public_key("alipay_public_key").set_alipay_root_cert("alipay_root_cert").set_app_cert("app_cert"); match alipay_client.wap_pay("POST".into(), param).await { Ok(res) => { todo!(做一些平凡的事件) } Err(err) => { todo!(做一些平凡的事件) } } }应用下来是不是很不便,基本上与官网统一;另外因为对应API太多,如果框架内置的API不能满足对应的要求的话,能够间接依据文档内容实现对应的申请trait,就可能应用对应的API了。而后配套文档也根本都欠缺了,在应用的过程中能够很不便的查看某些办法应用的形式。 ...

August 17, 2022 · 1 min · jiezi

关于微信支付:微信支付万亿日志在Hermes中的实践

导语 | 微信领取日志零碎利用 Hermes 来实现日志的全文检索性能,自从接入以来,日志量持续增长。目前单日入库日志量曾经冲破万亿级,单集群日入库规模也曾经冲破了万亿,存储规模达 PB 级。本文将介绍微信领取日志零碎在 Hermes 上的实际,心愿与大家一起交换。文章作者:宋新村,腾讯大数据高级运维工程师。一、业务规模目前微信领取日志单日最大入库总量已达到万亿级,单日入库存储量达 PB 级,而在春节等重大节假日预计整个日入库规模会有进一步的增长。 微信领取日志业务采纳的 Hermes 集群,单集群日入库规模也曾经冲破了万亿级每天,节点部署有二百多台,单集群存储总量达到 PB 级。另外,每天的检索查问并发在 6000 左右: 在如此海量日志存储规模下,整个微信领取日志查问 SLA 达到了 4 个 9,95% 的耗时小于 5s。 二、存算拆散 Hermes 底层存储采纳 HDFS 来实现,所有的存储相干的策略都由业余的 HDFS 的能力来提供,包含: 1. 数据多正本容灾日志默认存储 2 正本容灾,针对历史数据能够灵便的升高副原本缩小存储老本,而针对十分重要的日志数据也能够灵便的减少副原本进步数据容灾能力。 2. 磁盘故障容错单磁盘或单机故障 HDFS 可主动迁徙正本,整个容错过程对下层计算层通明。 3. 冷热分级利用 HDFS 提供的异构存储能力,联合 Hermes 自身的按天分区存储,能够十分不便的实现数据的冷热分级。冷热分级后的数据对下层业务通明,业务无需关注数据自身的存储状况 4. EC编码HDFS 3.0 版本之后反对 EC 编码,进一步升高存储老本,目前临时未在线上实际。 通过采纳这种存算拆散的架构,一方面能够简化下层的计算层的设计;另一方面计算层计算索引的时候只需计算单份即可实现多正本容灾,从而极大的缩小计算层的 CPU、内存资源耗费,使得写入 QPS 成倍晋升。 三、异步索引合并Hermes 自身采纳类 LSM 的数据写入模式,数据先写入内存+WAL,积攒到肯定数量后再批量刷写到 HDFS 进行长久化存储。节点故障时,零碎通过回滚 WAL 进行数据恢复,从而确保整个写入为高效的程序写入。 ...

December 4, 2020 · 1 min · jiezi

关于微信支付:复盘微信支付金额不正确问题PHP浮点型计算

一、背景在做微信领取我的项目的时候,微信要求金额的单位必须为分,而数据库中订单金额单位是元,所以应用订单金额*100是正确的做法,然而会经常出现少一分钱的情况,这是为什么呢? 二、排查过程订单领取金额的计算非常复杂,所以单位转化为分之后再转化为整型,能够保障微信领取参数不出错,也是正确的做法。 但这外面暗藏了一个问题,还记得咱们问题产生的条件必须是“购买某商品时”吗?如果独自购买这个商品的话,订单的金额是19.9。咱们能够尝试: echo (int)(19.9 * 100); // 后果为1989,而非1990 这就导致了订单创立时给微信的领取数据是1990,而再次领取时却是1980,所以接口返回了“订单号反复”的谬误。 此时咱们会发现少了一分钱,为什么呢?让咱们看一下PHP官网文档来理解一下。 三、解决方案办法一 $total_fee = (int)(($order_money + 0.00001) * 100); 办法二 $total_fee = (int)bcmul($order_money, 100);

November 12, 2020 · 1 min · jiezi

关于微信支付:PHP微信内H5的支付方案JSAPI

一、背景有个商城我的项目,是微信内H5的商城须要应用微信领取 二、计划调研通过理解,微信领取反对h5领取+jsapi的形式反对,然而h5领取[参考备注1️]的计划是只反对微信外的h5,没方法对微信内关上的h5页面进行操作的,于是咱们最终还是采纳的jsapi的形式去进行微信内H5领取的计划。 三、JSAPI领取简介[参考备注2️] 过程 商户零碎和微信领取零碎次要交互: 1、商户server调用对立下单接口申请订单,api参见公共api【对立下单API】 2、商户server接管领取告诉,api参见公共api【领取后果告诉API】 3、商户server查问领取后果,api参见公共api【查问订单API】 四、微信领取向微信下单和音讯告诉微信领取jsapi这块,我没有应用官网demo和文档去本人实现一套,间接找了overtrue大大的 easywechat的composer包去进行,因为都封装好了,简略的说,就是分三步 1、获取到openid 2、向微信下单 参考代码链接 3、获取微信回掉信息/手动查问微信下单的订单状态领取回调信息 局部参考代码如下 //向微信下单局部参考代码use EasyWeChat\Factory;$config = [ // 必要配置 'app_id' => 'xxxx', 'mch_id' => 'your-mch-id', 'key' => 'key-for-signature', // API 密钥 // 如需应用敏感接口(如退款、发送红包等)须要配置 API 证书门路(登录商户平台下载 API 证书) 'cert_path' => 'path/to/your/cert.pem', // XXX: 绝对路径!!!! 'key_path' => 'path/to/your/key', // XXX: 绝对路径!!!! 'notify_url' => '默认的订单回调地址', // 你也能够在下单时独自设置来想笼罩它];$app = Factory::payment($config);$result = $app->order->unify([ 'body' => '腾讯充值核心-QQ会员充值', 'out_trade_no' => '20150806125346', 'total_fee' => 88, 'spbill_create_ip' => '123.12.12.123', // 可选,如不传该参数,SDK 将会主动获取相应 IP 地址 'notify_url' => 'https://pay.weixin.qq.com/wxpay/pay.action', // 领取后果告诉网址,如果不设置则会应用配置里的默认地址 'trade_type' => 'JSAPI', // 请对应换成你的领取形式对应的值类型 'openid' => 'oUpF8uMuAJO_M2pxb1Q9zNjWeS6o',]);===============================================================// 回调告诉$app = Factory::payment($config);$response = $app->handlePaidNotify(function ($message, $fail) { // 你的逻辑 return true; // 或者谬误音讯 $fail('Order not exists.');});$response->send(); // Laravel 里请应用:return $response;五、参考资料/备注/坑参考资料1️: ...

November 10, 2020 · 1 min · jiezi

码付宝个人免签收款神器

码付宝个人免签即时到账收款平台。 无需公司资质免签约,即时到账,个人微信、支付宝账号即可收款,即开即用,高效稳定。 支持一带多,一个帐号管理多个商户。 可以在账号查看和操作商户订单,用于统一管理多个商户,无需重复注册。 官网码付宝官网: https://pay.shopxo.net/ 支持平台微信支付宝银联接口文档码付宝接入文档 码付宝, 个人收款利器, 实时回调通知, 再也不用担心收款困难了. 实现原理通过app监听微信, 支付宝的收款通知栏的通知, 来做到回调识别. 对于通知的金额, 为了防止订单冲突, 金额相同而无法识别, 我们会在订单金额的基础之上做随机立减, 目前的立减规则为, 每次递减0.01元, 如果递减后的金额被占用, 则再递减0.01元, 依次类推. 让然, 会有2分钟的超时订单释放规则, 超过2分钟未付款的订单金额, 会被释放, 释放后可以重复生成此金额订单. 码付宝原理示例订单金额为10元: 第一个人进来占用了 10元的金额, 支付中 第二个人进来则会分配 9.99 元, 支付成功 第三个人在第二个人支付成功后下单分配 9.99 元 如果第一个人的订单因为超过2分钟没有支付, 则自动释放掉 第四个人在2分钟后下单, 则分配 10元

July 26, 2019 · 1 min · jiezi

微信小程序支付功能全流程实践

前言微信小程序为电商类小程序,提供了非常完善、优秀、安全的支付功能。在小程序内可调用微信的API完成支付功能,方便、快捷。小程序开发者在开发小程序时,支付流程是必然要接触到,今天胡哥就小程序支付的全流程为大家一一细说,让小伙伴能快速得掌握小程序支付能力,避免踩坑! 知己知彼,方能百战不殆 - 小程序支付流程图 举个栗子????:某用户小明在某电商小程序上购买一块肥皂,从浏览、下单到支付经历了什么样的过程呢? 打开电商小程序,搜索浏览到某雕肥皂,点击查看详情后,发现大小、丝滑程度都很合适,点击直接下单wx.login获取用户临时登录凭证code,发送到后端服务器换取openId在下单时,小程序需要将小明购买的商品Id,商品数量,以及小明这个用户的openId传送到服务器服务器在接收到商品Id、商品数量、openId后,生成服务期订单数据,同时经过一定的签名算法,向微信支付发送请求,获取预付单信息(prepay_id),同时将获取的数据再次进行相应规则的签名,向小程序端响应必要的信息(必须字段信息将在下文进行详细说明)小程序端在获取对应的参数后,调用wx.requestPayment()发起微信支付,唤醒支付工作台,进行支付小结进行微信支付,在小程序端我们主要做三件事: 注:服务端调用统一下单API、签名算法不再本次分享讨论范围内,请期待胡哥的另外一次分享。使用wx.login获取临时登录凭证code,发送到后端获取openId wx.login({ success (res) { if (res.code) { // 发起请求,换取openId wx.request({ url: '', data: { code: res.code } }) } }})将openId以及相应需要的商品信息发送到后端,换取服务端进行的签名等信息 wx.request({ url: '', data: { openId: '', num: 1, id: '111' }})接收返回的信息(必须要包含发起微信支付wx.requestPayment的参数),发起微信支付 wx.requestPayment({ // 时间戳 timeStamp: '', // 随机字符串 nonceStr: '', // 统一下单接口返回的 prepay_id 参数值 package: '', // 签名类型 signType: '', // 签名 paySign: '', // 调用成功回调 success () {}, // 失败回调 fail () {}, // 接口调用结束回调 complete () {}})注意:以上信息中timeStamp、nonceStr 、prepay_id、signType、paySign各参数均建议必须都由服务端返回(这样会尽最大可能性保证签名数据一致性),小程序端不做任何处理基于Taro的微信支付实例import Taro, { Component } from '@tarojs/taro'import { View, Text, Button } from '@tarojs/components'import './index.scss'export default class Index extends Component { config = { navigationBarTitleText: '首页' } componentWillMount () { } async componentDidMount () { } componentWillUnmount () { } componentDidShow () { } componentDidHide () { } /** * sendOrderInfo() * @description 提交订单信息,获取支付凭证,唤起支付 */ async sendOrderInfo () { // 获取临时登录凭证code let codeData = await Taro.login() // 换取openId let openId = '' if (codeData.code) { let res = await Taro.request({ // 定义的后端换取openId的接口 url: 'https://www.justbecoder.com/getLogin', data: { code: codeData.code } }) if (res && res.code === 0) { openId = res.openId } } // 发送openId以及对应的商品信息 let data = await Taro.requrest({ url: 'https://www.justbecoder.com/createdOrder', data: { openId, // 实际情况的商品数量 num: 1, // 实际情况的商品Id id: 111, } }) // code === 0 表示提交订单成功,返回需要的签名信息等 if (data && data.code === 0) { let { timeStamp, nonceStr, prepay_id, signType, paySign } = data.payInfo // 唤起支付,按小程序要求格式发送参数 let payData = await Taro.requestPayment({ timeStamp, nonceStr, package: 'prepay_id=' + prepay_id, signType, paySign }) if (payData && payData.errMsg === 'requestPayment:ok') { Taro.showModal({ title: '操作提示', content: '支付成功', showCancel: false, confirmText: '确定' }) } else { Taro.showModal({ title: '操作提示', content: '支付失败,请重新尝试', showCancel: false, confirmText: '确定' }) } } } render () { return ( <View className='index'> <Button onClick={this.sendOrderInfo}>立即下单</Button> </View> ) }}效果图 ...

July 16, 2019 · 2 min · jiezi

开发了一个微信群付费进群功能

准备本案例使用的支付接口是PayJs微信支付商户,没有商户号可以自己申请:https://payjs.cn/ref/DNXBJD 演示 1分钱体验 流程1、写出进群界面2、对接PayJs的JSAPI支付接口3、支付成功后跳转进群二维码 代码jiaqun-login.php这个代码主要是授权登录,获取用户的openid <!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0,viewport-fit=cover"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <meta name="format-detection" content="telephone=no"> <link rel="stylesheet" href="https://weui.io/weui.css"/> <link rel="stylesheet" href="https://weui.io/example.css"/> <title>正在登录</title></head><body></body></html><?phpheader("Content-type:text/html;charset=utf8");//发送请求$url = 'https://payjs.cn/api/openid?callback_url=你的域名/你的支付目录/jiaqun-getopenid.php';function post($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); $rst = curl_exec($ch); curl_close($ch); return $rst;}//发送$result = post($url);//返回接口的数据echo "<p style=\"display:none;\">".$result."</p>";?>jiaqun-getopenid.php这个主要是把获取到的openid传到支付订单页面 <?phpheader("Content-type:text/html;charset=utf8");$openid = $_GET["openid"];//浏览器跳转echo "<script>location.href=\"你的域名/你的支付目录/jiaqun-pay.php?openid=$openid\";</script>";?><title>请稍候</title>jiaqun-pay.php这个主要是构建订单发起请求参数,创建支付订单 <?php//引入配置文件require_once("config.php");//获得OPENID$openid = $_GET["openid"];//定义金额$total_fee = 1;$length = strlen($total_fee);if ($length == 1) { $money = "0.0".$total_fee;}else if ($length == 2) { $money = "0.".substr($total_fee, 0,1).substr($total_fee, 1,1);}else if ($length == 3) { $money = substr($total_fee, 0,1).".".substr($total_fee, 1,1).substr($total_fee, 2,3);}else if ($length == 4) { $money = substr($total_fee, 0,1).substr($total_fee, 1,1).".".substr($total_fee, 2,3).substr($total_fee, 4,4);}else if ($length == 5) { $money = substr($total_fee, 0,1).substr($total_fee, 1,1).substr($total_fee, 2,1).".".substr($total_fee, 3,2);}// 构造订单参数$data = [ 'mchid' => $mchid, 'body' => '付费进群', 'total_fee' => $total_fee, 'openid' => $openid, 'out_trade_no' => 'likeyunkeji.' . time(),];// 添加数据签名$data['sign'] = sign($data, $key);//发送请求$url = 'https://payjs.cn/api/jsapi?' . http_build_query($data);function post($data, $url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); $rst = curl_exec($ch); curl_close($ch); return $rst;}//发送$result = post($data, $url);//返回接口的数据$results = json_decode($result);//返回字符串$appId = $results->jsapi->appId;$timeStamp = $results->jsapi->timeStamp;$nonceStr = $results->jsapi->nonceStr;$package = $results->jsapi->package;$signType = $results->jsapi->signType;$paySign = $results->jsapi->paySign;// 获取签名function sign($data, $key){ array_filter($data); ksort($data); return strtoupper(md5(urldecode(http_build_query($data) . '&key=' . $key)));}?><html><head> <title>群聊邀请</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=0"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <meta name="format-detection" content="telephone=no"> <meta name="format-detection" content="email=no"> <meta name="apple-mobile-web-app-capable" content="yes"> <link href="https://cdn.bootcss.com/weui/1.1.2/style/weui.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/zepto/1.2.0/zepto.min.js"></script> <link rel="stylesheet" type="text/css" href="css/style.css"></head><body> <!-- 顶部区域 --> <div id="logo_con"> <div class="logoimg"><img src="css/qunlogo.png"/></div> <p class="qunname">里客云科技</p> <p class="qunrenshu">100人</p> </div> <!-- 空白部分 --> <p id="yqjrql">TANKING邀请你加入群聊</p> <!-- 支付按钮 --> <a href="javascript:;" id="jrql">加入群聊</a> <!-- 进群说明 --> <p id="jqsm">1. 该群聊人数较多,为减少新消息给你带来的打扰,建议谨慎加入。 <p id="jqsm">2. 你需要实名验证后才能接受邀请,可绑定银行卡进行验证。</p></body><script> if (typeof WeixinJSBridge == "undefined") { if (document.addEventListener) { document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false); } else if (document.attachEvent) { document.attachEvent('WeixinJSBridgeReady', onBridgeReady); document.attachEvent('onWeixinJSBridgeReady', onBridgeReady); } } function onBridgeReady() { WeixinJSBridge.call('hideOptionMenu'); } $('#jrql').on('click', function () { WeixinJSBridge.invoke( //构造发起支付参数,请在接口服务端生成 'getBrandWCPayRequest', { "appId": "<?php echo $appId ?>", "timeStamp": "<?php echo $timeStamp ?>", "nonceStr": "<?php echo $nonceStr ?>", "package": "<?php echo $package ?>", "signType": "<?php echo $signType ?>", "paySign": "<?php echo $paySign ?>" }, function (res) { if (res.err_msg == "get_brand_wcpay_request:ok") { // 支付成功后跳转页面 location.href="https://www.liketube.cn/payjs/css/wxqunqrcode.jpg"; } } ); });</script></html>config.php支付接口的一些参数 ...

June 29, 2019 · 3 min · jiezi

【实战教程】只需三步,用云函数又快又安全地实现小程序支付

本文主要侧重于讲述小程序在线支付功能中的编程思想和编程模式,并在必要的地方提供关键代码示例。(文末也将附上关键的 js 代码)为方便演示,这里将实现一个最简单的虚拟商品的订单支付功能,订单略去了收货地址和多规格、多数量的情况,示例中仅讨论在商品详情页中直接创建订单并发起支付的情况。需要分别定义 Product 表和 Order 表进行数据存取,在 BaaS 后台中创建两张数据表。一、数据表结构设计Product 表:数据表录入权限:所有人数据行读写权限:创建者可写,所有人可读Order 表:数据表录入权限:所有人数据行读写权限:创建者可写,创建者可读商品的订单结算和支付流程一般包括“创建订单 -> 支付 -> 更新订单状态”三个步骤。下文中将分析几种实现该流程的方案,供我们一起探讨。二、客户端创建订单,客户端更新订单状态我们先来看下只在客户端中如何处理这些逻辑。1) 创建订单:Order 表中创建一条新记录,status 字段默认值为 “no_paid”,保存订单金额,商品快照和商品 id 以及订单创建者,其中订单创建者由 BaaS 的用户系统自动处理,值为创建订单的用户 id:/** * 创建订单处理函数 /createOrderHandle() { const orderTableId = 12345678 const tableObject = new wx.BaaS.TableObject(orderTableId) const createObject = tableObject.create() const product = this.data.product const data = { product_id: product.id, product_snapshot: product, total_cost: product.price, status: ’no_paid’, } // 客户端创建订单,客户端更新订单状态 return createObject.set(data).save().then(res => { this.order = res.data || {} return this.pay(this.order) }).then(transactionNo => { return this.updateOrder(transactionNo) }).then(res => { wx.navigateTo({ url: ‘../order/order’ }) })2)支付:调用 BaaS SDK 提供的支付方法 wx.BaaS.pay,调起微信支付:/* * 发起微信支付 * @param {Object} order /pay(order) { const product = this.data.product const orderTableId = 12345678 const params = { totalCost: order.total_cost, merchandiseDescription: product.title, merchandiseSchemaID: orderTableId, merchandiseRecordID: order.id, merchandiseSnapshot: product, } return wx.BaaS.pay(params).then(res => { return res.transaction_no })}3)更新订单状态:支付成功后,更新 status 字段值为 “paid”,并更新微信支付序列号:/* * 更新订单状态 * 仅在由客户端更新订单状态时使用 * @param {String} transaction_no 支付成功后由微信返回的微信支付序列号 /updateOrder(transaction_no) { const orderTableId = 12345678 const tableObject = new wx.BaaS.TableObject(orderTableId) const recordId = this.order.id const record = tableObject.getWithoutData(recordId) record.set(‘status’, ‘paid’) record.set(’transaction_no’, transaction_no) return record.update()}我们从整体上来看支付流程,便能发现订单状态实质上是由客户端中 updateOrder 方法发起请求来进行更新的。而这一情况将导致极大的安全隐患。因为从原则上来说,我们认为来自客户端的信息都是不可信的,订单状态很容易被伪造出的一个请求跳过支付直接将状态更新为 ‘paid’,并更新一个假的 transaction_no。这意味着,不花一分钱也能将订单变为已支付。在生产环境中,任何情下都不应该使用这种支付流程。三、客户端创建订单,触发器更新订单状态基于这种情况,你或许会想:既然由客户端来更新订单状态会引起安全问题,又没有后端开发者参与,要怎么做?BaaS 平台中触发器和云函数可以帮你解决这个问题。它们可以完成这种非客户端的处理逻辑,同时使用它们的时候跟开发后端应用又有很大的不同。首先来看一下触发器(Trigger),触发器是一种当触发条件被满足,将会执行触发器中的事先定义的动作,定义好的动作可以是操作数据库或者调用云函数。我们希望当支付完成之后,触发器可以帮我们自动地操作数据库,更新订单对应的 status 和 transaction_no 字段。触发器设置如下:「触发类型」选择微信支付回调,条件是支付成功后执行触发器。一般触发器类型常见的还有操作数据表,定时任务等,分别对应操作数据表后触发和定时触发。「动作」定义了触发器将要执行的操作,这里是更新 Order 数据表对应的 status、total_cost 和 transaction_no 字段。更多触发器的具体细节,不同平台的实现有所不同,在此不展开讨论。借助触发器,客户端创建订单成功后不需要再调 updateOrder 方法,Order 订单的数据会自动更新成支付成功对应的状态:/* * 创建订单处理函数 /createOrderHandle() { … // 与上文相同 // 客户端创建订单,触发器自动更新订单状态 return createObject.set(data).save().then(res => { this.order = res.data || {} return this.pay(this.order) }).then(res => { wx.navigateTo({ url: ‘../order/order’ }) })}值得注意的是,上面介绍的第一种方案中 Order 表的 ACL 数据行读写权限是创建者可写的,意味着创建者可以对数据进行任意操作,将更新订单状态的工作交给触发器后,Order 表的 ACL 数据行读写权限应设置为「不可写」,保证 Order 表的数据创建后不会由外部更改,提高了数据的安全性。四、云函数创建订单,触发器更新订单状态细心的读者可能发现了除了 status 和 transacton_no 字段外,还由触发器自动更新了 total_cost 字段,保存的是实际支付的金额。这就引出了另外一个问题,虽然现在不能通过客户端修改订单状态,但是创建订单的所有数据仍是由客户端发起请求,在请求参数中定义的,这种方式同样很容易被人篡改数据,比如 1000 元的商品可以被更改成 1 元甚至 0 元,造成只需要花很少的钱就可以买到高价值的商品。使用触发器自动根据微信支付回调更新 total_cost 可以保证无论何种情况下,数据中保存的都是最终用户实际支付的金额。虽然这种方式可以事后帮助我们发现订单金额异常的问题,但还是不能解决在创建订单时金额被篡改的问题,这又要如何解决呢?这时候创建订单的功能应该交给后端逻辑去做了,在 BaaS 平台中就需要用到云函数了,云函数又被称为 FaaS(Functions as a Service)函数即服务。云函数是一段可以部署在服务端的代码,关键词是一段代码,而不是一整套的后端逻辑,它本质上就是函数而已,特别是对于运行在 node.js 环境下的云函数来说,它跟平常所写的 JavaScript 代码几乎一模一样,对前端开发者来说非常容易上手。云函数可以由 SDK 或触发器调用,也可以在云函数之间相互调用。为了避免创建订单时客户端数据篡改或商品信息不能实时同步的问题,我们将创建订单的逻辑迁移到 BaaS 平台的云函数中:关注「知晓云」微信公众号,在微信后台回复「创建订单」,获取完整的【创建订单】云函数源码。调用该云函数时传入商品 id,云函数先查出此商品的具体信息,再使用该商品信息来创建订单,整个过程在 BaaS 平台的云函数系统中完成,保证了数据的准确性。支付完成后,触发器同样会自动更新订单状态。客户端中使用 invokeFunction 方法调用云函数:/* * 创建订单处理函数 /createOrderHandle() { … // 与上文相同 // 使用云函数创建订单,触发器更新订单状态 wx.BaaS.invokeFunction(‘createOrder’, { product_id: this.data.product.id }).then(res => { this.order = res.data || {} return this.pay(this.order) }).then(res => { wx.navigateTo({ url: ‘../order/order’ }) })}由于创建订单和更新订单的操作已经分别交由云函数和触发器处理了,为了更好的安全性,Order 表的数据创建权限和修改权限都不应该对客户端开放。需要额外说明的是,而触发器和云函数系统级别的操作,相当于拥有最高权限,所以我们这里相当于禁止了客户端中除了读取数据外的所有操作,也就使得 Order 表的权限控制和数据的准确性得到了安全的保障。五、云函数创建订单,云函数校验并更新订单状态我们再来研究一下代码,在 pay 这个方法中 wx.BaaS.pay(params) 所做的事情实际上是发起一个请求,获取 BaaS 系统返回的支付解密数据,然后使用这些支付解密数据调用微信客户端的支付功能,最终由用户输入密码完成支付。同理,根据客户端提供的数据都不可信的原则,这个请求中 params 参数时的数据同样可以被伪造,比如修改掉 totalCost 的值,也会导致最终支付的金额跟实际应该支付的金额不一值,根据之前触发器的设定,虽然会如实地记录了最终支付的金额,可以为后台追溯金额异常的订单提供依据,但是并不会阻止订单更新为已支付的状态。当用户支付成功后,我们更希望在更新订单状态前可以先进行支付数据的校验,校验不通过则不更新订单状态。想要实现这个功能,则要将触发器和云函数进行搭配使用了。先将触发器的动作类型改为云函数:微信支付成功后会触发调用 verifyPayment 云函数:客户端的代码保持不变,此时整个流程是:调用 createOrder 云函数创建订单,拿到创建订单成功的回调数据后,发起支付,支付成功之后,由触发器自动调用 verifyPayment 云函数,校验实付金额是否跟该商品的价格一致,若一致则更新该订单为已支付状态。在 verifyPayment 云函数中只考虑了校验实付金额这一个维度,在实际开发中应综合考虑更多维度来确保数据准确,在此不再展开讨论。至此,本文完成了一个小程序在线支付的案例,介绍了如何借助 BaaS 平台最快地实现小程序在线支付功能,通过开发过程中发现的各种安全问题,迭代出四种不同的实现方案,一步步完善支付功能的安全性,最后得出一个最快最安全实现小程序在线支付的方案。六、商品详情页和云函数 js 代码商品详情页 js 代码/* 商品详情页 js 代码 /const productTableId = 12345678const orderTableId = 123456789Page({ data: { product: {} }, onLoad(options) { // 设置默认的商品 id,方便调试 const productId = options.id || ‘5ade97135acfb521865bf766’ this.getProductDetail(productId) }, / * 获取商品详情信息 * @param {String} id / getProductDetail(id) { const tableObject = new wx.BaaS.TableObject(productTableId) const query = new wx.BaaS.Query() query.compare(‘id’, ‘=’, id) tableObject.setQuery(query).find().then(res => { const objects = res.data.objects || [] const product = objects[0] || {} this.setData({ product }) }) }, /* * 点击立即购买按钮事件 / createOrder(e) { wx.getSetting({ success: res => { if (res.authSetting[‘scope.userInfo’]) { this.createOrderHandle() } else { wx.BaaS.login() } } }) }, /* * 创建订单处理函数 / createOrderHandle() { const tableObject = new wx.BaaS.TableObject(orderTableId) const createObject = tableObject.create() const product = this.data.product const data = { product_id: product.id, product_snapshot: product, total_cost: product.price, status: ’no_paid’, } // 客户端创建订单,客户端更新订单状态 // return createObject.set(data).save().then(res => { // this.order = res.data || {} // return this.pay(this.order) // }).then(transactionNo => { // return this.updateOrder(transactionNo) // }).then(res => { // wx.navigateTo({ url: ‘../order/order’ }) // }) // 客户端创建订单,触发器更新订单状态 // return createObject.set(data).save().then(res => { // this.order = res.data || {} // return this.pay(this.order) // }).then(res => { // wx.navigateTo({ url: ‘../order/order’ }) // }) // 使用云函数创建订单,触发器或云函数更新订单状态 wx.BaaS.invokeFunction(‘createOrder’, { product_id: this.data.product.id }).then(res => { this.order = res.data || {} return this.pay(this.order) }).then(res => { wx.navigateTo({ url: ‘../order/order’ }) }) }, /* * 发起微信支付 * @param {Object} order / pay(order) { const product = this.data.product const params = { totalCost: order.total_cost, merchandiseDescription: product.title, merchandiseSchemaID: orderTableId, merchandiseRecordID: order.id, merchandiseSnapshot: product, } return wx.BaaS.pay(params).then(res => { return res.transaction_no }) }, /* * 更新订单状态 * @param {String} transaction_no 支付成功后返回的微信支付订单号 / updateOrder(transaction_no) { const tableObject = new wx.BaaS.TableObject(orderTableId) const recordId = this.order.id const record = tableObject.getWithoutData(recordId) record.set(‘status’, ‘paid’) record.set(’transaction_no’, transaction_no) return record.update() }})创建订单云函数/* 创建订单云函数 /const productTableId = 12345678const orderTableId = 123456789exports.main = function createOrder(event, callback) { const {product_id} = event.data const user_id = event.request.user.id getProductDetail(product_id).then(product => { return createOrderHandel(product, user_id) }).then(res => { const order = res.data || {} callback(null, order) }).catch(err => { callback(err) })}function getProductDetail(id) { const tableObject = new BaaS.TableObject(productTableId) const query = new BaaS.Query() query.compare(‘id’, ‘=’, id) return tableObject.setQuery(query).find().then(res => { const objects = res.data.objects || [] const product = objects[0] || {} return product })}function createOrderHandel(product, user_id) { const tableObject = new BaaS.TableObject(orderTableId) const createObject = tableObject.create() const data = { product_id: product.id, product_snapshot: product, total_cost: product.price, status: ’no_paid’, created_by: user_id } return createObject.set(data).save()}校验并更新订单状态云函数/ 校验并更新订单状态云函数 **/const productTableId = 12345678const orderTableId = 123456789exports.main = function verifyPayment(event, callback) { const data = event.data const totalCost = data.total_cost const orderId = data.merchandise_record_id const transactionNo = data.transaction_no const merchandiseSnapshot = data.merchandise_snapshot const productId = merchandiseSnapshot.id getProductDetail(productId).then(product => { if (product.price === totalCost) { updateOrder(orderId, transactionNo) } })}function getProductDetail(id) { const tableObject = new BaaS.TableObject(productTableId) const query = new BaaS.Query() query.compare(‘id’, ‘=’, id) return tableObject.setQuery(query).find().then(res => { const objects = res.data.objects || [] const product = objects[0] || {} return product })}function updateOrder(orderId, transaction_no) { const tableObject = new BaaS.TableObject(orderTableId) const recordId = orderId const record = tableObject.getWithoutData(recordId) record.set(‘status’, ‘paid’) record.set(’transaction_no’, transaction_no) return record.update()}知晓云是国内首家专注于小程序开发的后端云服务。使用知晓云,小程序开发快人一步。 ...

March 25, 2019 · 4 min · jiezi

Andriod监听支付宝收款实现个人支付宝支付接口!附安卓App

首先呢,我不会开发安卓App,这款APP是我在酷安网看到的,非常简单的一款APP,安装后填写我们的后端接口(用于接收收款通知的)就可以接收收款通知了。所以就算我们没有这款APP的源码,我们也可以做一个支付系统了。APP界面:界面就这点东西了!只需要设置后端接口就可以接收这个APP监听的支付宝收款数据了APP会以POST方式向您的接口POST一段JSON数据数据格式如下:{“title”:0.01,“time”:“2019-02-26”,“title”:“支付宝支付”,“content”:“成功收款1.00元。享免费提现等更多专属服务,点击查看”}下面是我写的PHP后端简易版:<?php// 定义接收JOSN数据header(“Content-Type:application/json”);// 接收从APP端POST过来的数据$json = $GLOBALS[‘HTTP_RAW_POST_DATA’];// 将JSON数据转换为PHP对象$obj = json_decode($json);// 解析对象返回字符串$money = $obj->money; // 返回支付金额$title = $obj->title; //返回支付标题$time = $obj->time; // 返回支付时间$content = $obj->content; // 返回支付内容// 连接数据库$con = mysql_connect(“数据库地址”,“数据库账号”,“数据库密码”);if (!$con){die(‘Could not connect: ’ . mysql_error());}//选择数据mysql_select_db(“数据库名”, $con);//设置字符集mysql_query(“SET NAMES UTF8”);//插入数据库mysql_query(“INSERT INTO 表名 (paymoney, paytime, title, content) VALUES (’$money’, ‘$time’, ‘$title’, ‘$content’)”);//关闭数据库连接mysql_close($con);?>数据库接收到的通知:App下载:https://www.coolapk.com/apk/c…作者:TANKING时间:2019-2-26网站:http://likeyunba.com

February 26, 2019 · 1 min · jiezi

获取到 prepay_id 后将参数再次签名传输给 APP 发起支付

获取到 prepay_id 后将参数再次签名传输给 APP 发起支付。相信有不少同学因为看到统一下单返回的结果中有 sign 字段,会直接将结果返回给 APP 端,结果 APP 端没办法调起微支付。其实需要对 APP 端用到的字段数据按 “统一下单的签名方式” 签名后得到的 sign,才是 APP 端需要的 sign。微信支付 App支付 在服务端调用统一下单接口后,服务端需要将返回的订单数据进行二次签名后才能返回给 App 端。开发文档中说的并不是很明确,因为统一下单的返回数据和二签的原数据上存在一些重叠。微信支付服务端 sdk 提供了 WxPayResults 类,类中也的确提供了生成签名方法,即对结果集签名,源码如下:以 PHP 版为例,其他语言自行对照。class WxPayResults extends WxPayDataBase{ /** * 生成签名 - 重写该方法 * @param WxPayConfigInterface $config 配置对象 * @param bool $needSignType 是否需要补signtype * @return 签名,本函数不覆盖sign成员变量,如要设置签名需要调用SetSign方法赋值 */ public function MakeSign($config, $needSignType = false) { //签名步骤一:按字典序排序参数 ksort($this->values); $string = $this->ToUrlParams(); //签名步骤二:在string后加入KEY $string = $string . “&key=” . $config->GetKey(); //签名步骤三:MD5加密或者HMAC-SHA256 if (strlen($this->GetSign()) <= 32) { //如果签名小于等于32个,则使用md5验证 $string = md5($string); } else { //是用sha256校验 $string = hash_hmac(“sha256”, $string, $config->GetKey()); } //签名步骤四:所有字符转为大写 $result = strtoupper($string); return $result; }}注意步骤三,是需要获取 sign 来判断使用什么方式生成 sign 的,是不是有种鸡生蛋,蛋生鸡的短路既视感。在 APP 端调起支付的参数列表的 sign 参数里有提示 “注意:签名方式一定要与统一下单接口使用的一致”,所以这里的逻辑是要你将统一下单返回的 sign 传递进来,以便于统一签名方式。签名后一定要用真的签名去覆盖用来传递签名方式的“签名”。在统一下单接口中,生成签名的流程是 $obj->setSign() 调用 $obj->makeSign(),而后我们可以 $obj->getSign() 将签名加到请求数据中。但在结果集类中,makeSign 却直接调用了 getSign 来判断使用何种方式生成签名,所以对结果集签名时,需确保结果集中包含了同一下单返回的 sign 字段数据,这样结果集才能满足 “注意:签名方式一定要与统一下单接口使用的一致” 的要求。所以这个类对签名进行了重写的目的,主要是为了保证二次签名的签名方式与统一下订单的签名方式一致,将统一下单的签名作为 sign 传递给 WxPayResults 然后调用 makeSign,makeSign 就能判断出统一下单的签名方式,与之保持一致。统一下单成功接口返回的数据$uniorder = array ( ‘appid’ => ‘wxd930ea5d5a258f4f’,//appid ‘device_info’ => ‘WEB’, ‘mch_id’ => ‘1900000109’,// 商户id ’nonce_str’ => ‘g6OZoULWyliPmiPm’, ‘prepay_id’ => ‘wx12143635206473d0a53e80f14278847815’, ‘result_code’ => ‘SUCCESS’, ‘return_code’ => ‘SUCCESS’, ‘return_msg’ => ‘OK’, ‘sign’ => ‘E91035CA24EDF115374BD2B4C4F9B419’,//统一下单的签名 ’trade_type’ => ‘APP’,)服务端需要二签的数据文档地址:https://pay.weixin.qq.com/wik…package 暂填写固定值Sign=WXPaynoncestr 并不一定要统一下单返回的 nonce_str,自己生成 32位 的也可以timestamp 自己生成即可sign 传递统一下单返回的签名,以使得结果集签名和统一下单签名方式一致(或者你清楚的知道你对结果集签名的方式同下单的一致)如果自己写,二不用 sdk 的话,我们需要对<?php// 传递的数据$app_result = array ( ‘appid’ => $uniorder[‘appid’],//从统一下单的结果中取 ‘partnerid’ => $uniorder[‘mch_id’],//从统一下单的结果中取 ‘prepayid’ => $uniorder[‘prepay_id’],//从统一下单的结果中取 ‘package’ => ‘Sign=WXPay’,//自己写 ’noncestr’ => WxPayApi::getNonceStr();,//自己写 ’timestamp ’ => time(),//自己写);// 与统一下单的签名方式一致即可$sign = signMethodConsistWithUniOrder($app_result);$app_result[‘sign’] = $sign;// 返回给 APP 端return $$app_result;如果用 sdk 的务必要将 统一下单返回的数据里的签名 sign 也传递给 WxPayResults 类,已使得保证签名方式一致<?php// 传递的数据// 传递的数据$app_result = array ( ‘appid’ => $uniorder[‘appid’],//从统一下单的结果中取 ‘partnerid’ => $uniorder[‘mch_id’],//从统一下单的结果中取 ‘prepayid’ => $uniorder[‘prepay_id’],//从统一下单的结果中取 ‘sign’ => $uniorder[‘sign’],//用来使结果集签名方式与统一下单签名方式一致 ‘package’ => ‘Sign=WXPay’,//自己写 ’noncestr’ => WxPayApi::getNonceStr();,//自己写 ’timestamp ’ => time(),//自己写);$wxPayResults = new WxPayResults();// 构建 WxPayResults 对象$wxPayResults->FromArray($app_result);// 真正的返回数据的签名 覆盖用来统一签名方式的“签名”$app_result[‘sign’] = $wxPayResults->makeSign($wxPayConfig);//然后更新成二签后的sign// 返回给 APP 端return $$app_result;App 端调用微信支付的方式为IWXAPI api;PayReq request = new PayReq();request.appId = “wxd930ea5d5a258f4f”;request.partnerId = “1900000109”;request.prepayId= “1101000000140415649af9fc314aa427”,;request.packageValue = “Sign=WXPay”;request.nonceStr= “1101000000140429eb40476f8896f4c9”;request.timeStamp= “1398746574”;request.sign= “7FFECB600D7157C5AA49810D2D8F28BC2811827B”;api.sendReq(request);使用服务端提供的数据发起支付请求即可。 ...

January 12, 2019 · 2 min · jiezi

关于微信支付

首先明确自己的需求 需要什么类型的支付(扫码/Native支付,H5支付,APP支付,JSAPI支付等)扫码/Native支付{:target="_blank"}官方文档:Native支付是指商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站、实体店单品或订单、媒体广告支付等场景。H5支付{:target="_blank"}官方文档:H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付。主要用于触屏版的手机浏览器请求微信支付的场景。可以方便的从外部浏览器唤起微信支付。APP支付{:target="_blank"}官方文档:APP支付是指商户通过在移动端应用APP中集成开放SDK调起微信支付模块来完成支付。适用于在移动端APP中集成微信支付功能的场景。JSAPI支付{:target="_blank"}官方文档:JSAPI支付是指商户通过调用微信支付提供的JSAPI接口,在支付场景中调起微信支付模块完成收款。应用场景有:线下场所:调用接口生成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付公众号场景:用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付PC网站场景:在网站中展示二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付扫码/Native支付H5支付APP支付JSAPI支付服务号服务号服务号/开放平台账号服务号这里不得不吐槽下微信,所有材料提交要审核3五天,然后300块审核费用,然后签约支付功能还要审核几天。最坑爹的是,在写APP支付过程中,我隐隐约约记得服务号可以开通APP支付权限接口,然后没找到,然后就以为自己傻逼了记错了,又匆匆申请一个开放平台账号,没错开放平台账号又给分配了一个商户号,然后又是提交审核材料,这次有四五天,继续缴纳审核的300块费用,然后继续签约APP支付权限,又要等两天,等把APP调通后,偶然间打开了之前服务号,没有错,APP支付这货又出现了!!!我去,这不是玩呢。最后我也没有去开通服务号的APP支付功能,有试过的小伙伴可以留言告诉下我能不能用!

January 9, 2019 · 1 min · jiezi

前端在h5页面调起微信支付接口和支付宝接口(日常笔记)

微信支付结合微信支付的api文档进行配置。参考JSAPI支付开发者文档——微信内H5调起支付微信文档中的例子如下。function onBridgeReady(){ WeixinJSBridge.invoke( ‘getBrandWCPayRequest’, { “appId”:“wx2421b1c4370ec43b”, //公众号名称,由商户传入 “timeStamp”:“1395712654”, //时间戳,自1970年以来的秒数 “nonceStr”:“e61463f8efa94090b1f366cccfbbb444”, //随机串 “package”:“prepay_id=u802345jgfjsdfgsdg888”, “signType”:“MD5”, //微信签名方式: “paySign”:“70EA570631E4BB79628FBCA90534C63FF7FADD89” //微信签名 }, function(res){ if(res.err_msg == “get_brand_wcpay_request:ok” ){ // 使用以上方式判断前端返回,微信团队郑重提示: //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。 } }); }// 下面是兼容不同浏览器绑定事件的方法if (typeof WeixinJSBridge == “undefined”){ if( document.addEventListener ){ document.addEventListener(‘WeixinJSBridgeReady’, onBridgeReady, false); }else if (document.attachEvent){ document.attachEvent(‘WeixinJSBridgeReady’, onBridgeReady); document.attachEvent(‘onWeixinJSBridgeReady’, onBridgeReady); }}else{ onBridgeReady();}我们主要是从后台中获取数据传入onBridgeReady这个方法中。所以第一步是获取数据,第二步是把获取到的数据传入到onBridgeReady方法第一步:发送请求获取后台数据1.在对应的api文件下封装请求(get)export function wechatPay(type, vid, token, point, discount) { let discount_type = discount || null return axios.get(${Host}/api/save_mobile,{ params: { pay_type: type, video_id: vid, token, point, discount_type } })}2.在对应的组件调用请求<p @click="_wechatPay(paytype, $route.query.video_id, info.token, info.points)" class=“submit”>发送支付请求</p>import { wechatPay } from ‘../../../api/pay.js’export default { name: ‘payfooter’, computed: { info() { return this.$store.state.user.info }, // 获取选择支付的方式 paytype() { return this.$store.state.pay.paytype } }, methods: { _wechatPay(type, vid, token, point) { wechatPay(type, vid, token, point).then(res => { console.log(res) // 这个res就是后台返回的数据 }) } }} 3.后台返回的json格式数据如下(这不是console出来,方便显示我就直接把json数据复制过来){ “code”: 0, “data”: { “appId”: “wx5beac7c40c”, “nonceStr”: “8491k3Rs5”, “package”: “prepay_id=wx07**************2653”, “paySign”: “CDE21B40C1A”, “signType”: “MD5”, “timeStamp”: “151” }, “msg”: null}第二步:把数据传给onBridgeReady函数所以真正需要获取的内容是 res.data.data,然后再把res.data.data的值传给onBridgeReady函数4.重新整理一下代码就是 methods: { _wechatPay(type, vid, token, point) { wechatPay(type, vid, token, point).then(res => { res = res.data if(res.code === 0) { this.onBridgeReady(res.data) // 这样就把res.data传给onBridgeReady函数 } }) }, // 微信支付api相关配置文档 onBridgeReady(data) { if (typeof WeixinJSBridge === ‘undefined’) { this.$toast({ message: ‘请使用微信内置浏览器进行支付’ }) } else { WeixinJSBridge.invoke( ‘getBrandWCPayRequest’, { appId: data.appId, // 公众号名称,由商户传入 timeStamp: data.timeStamp, // 时间戳,自1970年以来的秒数 nonceStr: data.nonceStr, // 随机串 package: data.package, signType: data.signType, // 微信签名方式: paySign: data.paySign // 微信签名 }, res => { if (res.err_msg === ‘get_brand_wcpay_request:ok’) { this.$toast({ message: ‘支付成功’ }) this.$router.push({path: ‘/videoplayer’, query: { video_id: this.$route.query.video_id }}) // 支付成功之后跳转的路由 } else { this.$toast({ message: ‘支付失败’ }) } } ) } }, }支付宝支付与微信支付不同的是,支付宝支付后台是返回form格式的数据,如下<form name=“punchout_form” method=“post” action=“https://openapi.alipay.com/gateway.do?charset=UTF-8&method=alipay.trade.wap.pay&sign=DEpMkIeWUs6EW3QKlt9OHYv%2FqkporO8Sr5%2Bay5VA9dpx3pAbIiPPajQ2gEcWHvz5bmkxH8ZvHUXahQL9S69p9wKNXpXOxYadlsxE8QKGUc4cO5rrgGq08%2BpiOq%2FOz4fLogEBWANXILUMWXNzJn8YryNifZ416Pd%2BxkKgXs%2Fo%2FQDcqEUgVXXPRq7IGRGQg%2FpZkOhxCH%2Fq%2B9hnWEncAfQLlAXfPqjdcQTNJ0TJdVr1X1ENOdAr5LQkydWw2EQ8g%3D%3D&return_url=+https%3A%2F%2**********&notify_url=+https%3A%2F%Fpub%2Fapi%2Fv1%2Fallback1&version=1.0&app_id=2057&sign_type=R&timestamp=2019-055&alipay_sdk=al*****.49.ALL&format=json”> <input type=“hidden” name=“biz_content” value="{&quot;body&quot;:&quot;&quot;,&quot;enable_pay_channels&quot;:&quot;balance,moneyFund,bankPay,debitCardExpress,creditCardExpress,creditCard,pcredit,pcreditpayInstallment,coupon,point,voucher,mdiscount,honeyPay&quot;,&quot;out_trade_no&quot;:&quot;132ecf937ad84487aa6cbaeb2ec157fe&quot;,&quot;product_code&quot;:&quot;13&quot;,&quot;subject&quot;:&quot;SpringBoot 2.x微信支付在线教育网站项目实战&quot;,&quot;timeout_express&quot;:&quot;20m&quot;,&quot;total_amount&quot;:&quot;98&quot;}"> <input type=“submit” value=“立即支付” style=“display:none” ></form><script>document.forms[0].submit();</script>那么在处理后台数据的时候用下面的方法(参考网络大神)_wechatPay(type, vid, token, point) { wechatPay(type, vid, token, point).then(res => { const form = res.data const div = document.createElement(‘div’) div.id = ‘alipay’ div.innerHTML = form document.body.appendChild(div) document.querySelector(’#alipay’).children[0].submit() // 执行后会唤起支付宝 })} ...

January 7, 2019 · 2 min · jiezi

【实战教程】使用知晓云完成微信卡券消息的处理

知晓云新推出「消息推送」功能,该功能通过「消息推送」类型的触发器接收微信推送过来的消息,开发者可以对此消息实行相关操作。此教程将带领大家体验这个新功能,实现一个「微信消息推送」类型的触发器。该触发器将会在消费者核销微信优惠券的时候触发,并调用一个云函数。调用的云函数会将核销的相关信息保存在一个特定的数据表中,由此来记录公众号卡券的使用情况。一、开通知晓云消息推送功能知晓云控制台 -> 设置 -> 小程序,拉到最底找到「消息推送」,点击 立即开通,即可开通消息推送功能:开通之后需要将消息推送的相关配置项配置到小程序或者公众号后台,此教程为实现接收微信卡券核销事件的消息的功能,所以需要将配置项配置到公众号后台。进入公众号后台 点击开发->基本配置->服务器配置,同步配置成知晓云消息推送的相关配置,完成配置后,微信消息推送类型的触发器方可使用。▲ 知晓云配置项▲ 微信公众平台配置项二、创建云函数后面我们会创建一个动作类型为「云函数」的触发器,所以我们需要先创建一个云函数,供触发器使用。现在我们创建一个云函数,用于用户在核销卡券的事件触发时调用该云函数操作数据表,将微信推送过来的核销的相关数据保存到相关到表中。云函数 user_consume_card.js,tableID 必须是已存在 table (需要提前在知晓云控制台创建表),并且有 data 中相应字段的列,否则将创建不成功。微信消息推送触发器返回的数据可在云函数的第一个参数 event.data 获取到,具体返回的数据有哪些可以查看微信开发者文档。例如卡券核销的返回数据如下,只是触发器将微信的 XML 格式的数据转换成了 JSON 格式。三、创建触发器添加一个「微信消息推送」类型的触发器,该触发器会在指定的条件触发时触发该触发器,点击 引擎 -> 触发器 -> 添加 。1.触发器配置,触发器类型一定要选择「微信消息推送」2.触发条件设置这一步需要填写公众号的 AppID ,ID 的获取需要进入「公众号平台」,点击 开发->基本配置->服务器配置 即可看到 AppID。参数规则: 触发触发器的参数规则可以填写微信事件名称,如果需要查看相关事件名称可以查看微信卡券事件推送教程。此教程为卡券核销事件推送,因此触发条件就为 evnet = user_consume_card 的事件:3.动作 动作类型选择云函数,当然你也可以选择其他的动作类型,选中我们创建云函数步骤中创建的云函数,配置好之后,当用户核销卡券时即会触发该触发器,并调用对应的云函数。至此,我们的微信消息推送触发器的 Demo 就完成了。后续需要通过创建卡券,并核销卡券触发该触发器:四、创建优惠券接下来我们来制作微信卡券,制券成功并核销后,将触发我们上面创建的触发器。1.制券 微信公众平台 -> 卡券功能 -> 优惠券,点击「新建优惠券」,并选择卡券类型填写卡券详细信息注意选择合适的「核销方式」,这关联到后面的核销可以采用那种方式进行核销。填写好相关信息点击下一步进入到「使用设置」,填写相关信息后提交审核。2.投放 审核通过后即可投放,支持二维码、公众号图文、群发、摇周边等多种形式投放,这里选择下载二维码进行投放消费者扫码领取优惠券,点击「立即使用」显示优惠券码,如果在第三步中「使用设置」的「核销方式」选择了二维码或者条形码,则会以优惠券的二维码或者条形码 + 卡券号的形式显示,本教程选择了「仅卡券号」,所以只显示了卡券号。核销(三种方式)手机核销网页核销自助核销本教程采用手机核销,其他核销方式可在「微信公众平台」查看。添加核销员之前,店员需要先关注「卡券商户助手」公众号,才能配置核销权限:添加核销员 添加核销员后,店员可在「卡券商户助手」中选择「扫一扫核销」|者「卡券号核销」五、查看触发器触发日志卡券核销之后,可以在知晓云控制台 -> 引擎 -> 触发器,找到之前创建的触发器( user_consume_card ),查看日志。触发器调用云函数,并且创建了一条核销记录,可在数据表中找到该表进行查看。本文首发于「知晓云」公众号:https://mp.weixin.qq.com/s/_w…如果你还想了解 更多小程序开发技巧,快速掌握小程序开发能力。欢迎扫描下方二维码关注「知晓云」,我们会持续为更新与小程序有关的实战教程哦~

December 29, 2018 · 1 min · jiezi

个人申请官方微信支付接口,即时到账!还支持个人小程序支付!附支付demo

我们知道要想使用微信支付,要具备以下条件1、申请服务号2、要有企业资料(营业执照,对公账户)3、微信认证(300元/年)这样才能申请到微信支付的,对于个人开发者,根本就是一个大门槛,为了微信支付而去注册一家公司,有点成本高了,那么个人可以用微信支付吗?在这之前不可以,现在可以了!因为微信官方有一个叫做微信服务商,有能力的企业可以申请成为微信官方签约的服务商,服务商签约后,就可以获得开发权限。所以有一家公司:北京顶风科技有限公司,他成为了服务商,然后开发了PAYJS,用于开放接口给个人开发者接入官方微信支付!北京顶风科技有限公司是微信支付官方签约的全国服务商,所以我们可以利用PAYJS的接口进行开发即可。而且申请这个接口只需要个人身份证!PAYJS官网:https://payjs.cn/ref/DNXBJDPAYJS的优点:1、即时到账2、微信官方接口3、安全稳定4、提供清晰易懂的开发文档和DEMO下面看我用PAYJS的接口开发的一个扫码支付:http://liketube.cn/payjs/扫码后,就是这样的收款方显示商户名称。扫码支付成功后,就是这样的微信支付商户助手是微信支付官方的收款助手,也就是你的每一笔收款,微信支付商户助手就会收到通知的,而且是即时到账,第二天统一由财务通结算,是财付通结算,财付通是腾讯的,所以大家不用担心金额安全问题。那么PAYJS有微信支付的能力吗?以上就是能力,可以做扫码支付,例如我上面的demo,还可以做jsapi支付,也就是在微信里面访问的页面,点击按钮发起支付的方式,还有一个能力就是支持个人微信小程序的,个人微信小程序无需认证也可以使用PAYJS支付接口实现。JSAPI微信内置浏览器支付:需要在微信内置浏览器打开链接。PAYJS小程序支付:还有网友们提供的DEMO和成品OK介绍到这里,牛不牛逼自己玩玩就知道了:https://payjs.cn/ref/DNXBJD

December 27, 2018 · 1 min · jiezi