小程序完整对接 pingpp支付

有几个先要条件:

  1. 小程序需要企业认证且开通支付功能,个人认证是无法使用支付功能的(小程序微信支付官网
  2. pingpp 本身接入的企业服务器(即商户服务器)并不强制要求 https,但是小程序是,所以也要一起强制要求全程 https
  3. pingpp 有一个账户,并且里面的配置渠道参数
  4. pingpp 已经配置好服务端,具体参考 pingpp 开发文档,不再详述(https://www.pingxx.com/docs/server

备注:pingpp,ping plus plus 简称 ping++

一、准备好 pingpp

大致的配置内容如下:

  • 根据图了解 pingpp 的支付流程,这是其中支付的内容(还有其他支付或者退款流程,但是不做详述,因为懂了一个就可以一理通百里明)


    image.png

一般的 pingpp 支付请求处理是根据上图所示:

  1. 用户在客户端选择商品并提交订单,客户端需要向你的服务端传递支付要素。注意:Ping++ SDK 不涉及你的客户端和你的服务端之间的数据交互,此处请你自定义通信方式。
  2. 服务端接收到客户端请求参数,并调用 Server-SDK封装的创建支付 Charge 的方法请求 Ping++ 。
  3. Ping++ 响应你的服务端请求,返回 Charge (支付凭据)给你的服务端。
  4. 你的服务端响应你的客户端请求,需要将该 Charge 对象完整的返回给你的客户端,注意:这里的 Charge 返回类型必须是 JSON 格式。
  5. 客户端拿到支付凭据 Charge 对象后,需要调用 Client-SDK 封装的方法调起支付控件,用户输入密码完成支付。
  6. 第三方支付渠道会直接在客户端返回支付结果,此处不要使用客户端的成功结果更新订单的最终状态。
  7. 在 Ping++ 管理平台配置 Webhooks 的 charge.succeeded 事件。支付完成时,Ping++ 会主动以 POST 方式向你配置在管理平台上的 Webhooks 通知地址发送支付结果,建议订单状态的更新对比客户端的渠道同步回调信息和服务端的 Ping++ Webhooks 通知来确定是否修改。
  8. 同时,建议在处理逻辑中添加主动查询机制:如果在可接受的时间范围内没有收到 Webhooks 通知,你也可以调用 Server-SDK 封装的查询方法,主动向 Ping++ 发起请求来获得订单状态,该查询结果可以作为交易结果。

参考:https://www.pingxx.com/docs/overview/transaction/charge?transaction=true

  • 其中在商户服务器发起支付请求到 ping++服务器的时候,就需要有这个支付渠道,配置好支持小程序的支付渠道即可。
image.png

二、server端接入

这里是 pingpp 帮我们封装好了微信小程序的支付流程,只需要传入wx_app_id公众号唯一标示和授权后跳转的地址就可以了,正常的流程并不是这么简单,具体可以参考微信公众号的支付开发文档:https://pay.weixin.qq.com/wiki/doc/api/index.html

小程序的 pingpp 调用支付流程是:

wx.login({ // 这个接口可以在打开小程序的时候调用,然后保存code用来后续使用
  success: function(res) {
    if(res.code){ // 获取到 code
      console.log('code = ' + res.code);
    }else{
     console.log('获取用户登录态失败!' + res.errMsg);
    }
  }
});

这里可以参看官方小程序登录流程图

  • 第二、得到 code 之后 以 GET的方式(使用 wx.request),请求你自己的服务端。然后在服务端使用 code 来获取 open_id,其中 $wx_app_id 是你的微信AppID(小程序ID) ,$wx_app_secret 是你的微信小程序密钥。
<?php
$code = $_GET['code'];
// 这里会返回一个 open_id,这个open_id是微信用户唯一标识
$open_id = \Pingpp\WxpubOAuth::getOpenid($wx_app_id, $wx_app_secret, $code);
  • 第三、将 open_id 作为创建 charge 时的 extra 参数传给 pingpp

这里可以参看官方小程序的支付流程图

这里须有几个地方需要注意:

  • 关于用户的 unionid
  1. 如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。
  2. 在传入 open_id 到 charge 提交给 pingpp 的时候,这里是需用 open_id 而不是 unionid 传入!
  • 关于 code,是可以在小程序登录时候获取,然后保存下来,在支付的时候使用即可,不需要每次支付都获取一次 code

官方小程序登录流程图

image.png

官方小程序的支付流程图

image.png

三、构建 pingpp.js

下载 pingpp 专门给小程序用的js sdk,在这个地址下载https://github.com/PingPlusPlus/pingpp-js

这里是需要自己构建的,使用 gulp 构建:

因为微信小程序中 不能使用其他支付渠道,构建时请添加该参数wx_lite

gulp build --channels=wx_lite

构建好后就会出现dist 目录:

 pingpp-js-master tree . -L 1
.
├── CHANGELOG.md
├── README.md
├── alipay_in_weixin
├── demo
├── dist  // 每次构建都会重新删除 dist 目录然后重新创建
├── gulpfile.js
├── mods.js.tmpl
├── node_modules
├── package.json
├── src
└── test

dist目录下会生成pingpp.js,我们需要的就是这个。

四、在小程序里面引入 pingpp.js

在小程序的支付订单页面的 js 文件(这个页面是根据自己开发的程序逻辑决定,总而言之,就是最终要在小程序支付的地方)

// 创建 pingpp charge 订单

// apiGet.pingppCreateCharge是自己写的封装函数,用来发起 pingpp 的支付请求,不需要理会
apiGet.pingppCreateCharge(payId, 'wx_lite').then(function (res) {
    console.log('result_pingpp:' + JSON.stringify(res));
// pingpp 会返回一个 charge 的支付请求,这里按需引入 pingpp 的 jssdk 包,然后发起真正的 pingpp 支付请求(即调起 pingpp 的支付控件)

    if (res.type == 1) {
      // 调起 pingpp 支付
      let pingpp = require('../../utils/libs/pingpp.js');
      // 执行 pingpp 的创建支付的方法pingpp.createPayment
      pingpp.createPayment(res.charge, function (result, err) {
        if (result == "success") {
          console.log(result);
          // payment succeeded 支付成功

        } else {
          console.log(result + " " + err.msg + " " + err.extra);
        }
      });
    }

pingpp.js 的目录需要自己放置到小程序的开发项目目录里面,目录根据自己需要确定

btw:

  1. 为什么要用 pingpp
    A:因为支付接口和流程异常复杂并且经常容易变动,如果维护起来是相当麻烦的,通过使用这种第三方封装的,且有专人维护的接口,会减少相当一部分的开发成本和后续维护成本

全文参考网址:

  1. pingpp 官方 jssdk 接入文档
  2. 小程序官方开发文档
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,550评论 18 139
  • 转载链接 注:本文转载知乎上的回答 作者:初雪 链接:https://www.zhihu.com/question...
    pengshuangta阅读 28,441评论 9 295
  • 我曾看过一句话说,评价一个人有趣就是对这个人的最高评价。初听时我迅速在脑海里搜寻着每一个夸人的词汇,深表赞同。 而...
    小宁檬阅读 162评论 0 0
  • 你是一只好看洒脱的蝴蝶 我好喜欢你但默不作声 我担心脚步声惊吓到你 我担心说话声吵乱你的心 我担心你因为我的失误而...
    花香一路阅读 489评论 6 15
  • 很久以前,有一头狮子,他叫我班明红毛,为什么叫班明红毛呢?因为他背上的颜色是鲜红色的红毛,于是这一头狮子变...
    薛义之Harry阅读 781评论 0 0