小程序开发实战案例之二|如何实现小程序支付
<div class="lake-content"><p class="ne-p"><span class="ne-text">上一章讲完如何获取用户信息授权 </span><span class="ne-text">后,下一步就可以进行小程序支付了。</span></p>
<p id="u1f8db9e3" class="ne-p"><span class="ne-text"><span class="ne-text"><span class="ne-text">本期就来介绍下支付宝小程序支付如何实现。</span></span></span></p>
<p id="u4abd6c9a" class="ne-p"><img width="200" id="u1d8b01b0" class="ne-image lazyload" data-src="https://intranetproxy.alipay.com/skylark/lark/0/2023/png/136731/1701759717472-86a1a9ae-9eda-46d2-b54a-e1fea0511034.png"></p>
<p id="uab3f6662" class="ne-p"> </p>
<p id="u54dc50fb" class="ne-p"><span class="ne-text">PS:接入前的准备工作可以参考:<span class="ne-text">接入准备</span><span class="ne-text">;接入指南可参考:<span class="ne-text">接入指南</span><span class="ne-text">~</span></span></span></p>
<p class="ne-p"> </p>
<h2 id="U6XEJ"><span class="ne-text">获取小程序支付权限</span></h2>
<p id="u3149b5d7" class="ne-p"><span class="ne-text">获取权限分为三步:分别是 <strong>账号开通 JSAPI 支付</strong><span class="ne-text">、<strong>账号与小程序账号绑定 </strong><span class="ne-text">以及 <strong>小程序绑定 JSAPI 产品</strong></span></span></span></p>
<p id="u07587a31" class="ne-p"> </p>
<h3 id="ZWaId"><span class="ne-text">账号开通 JSAPI 支付</span></h3>
<p id="u0db571d8" class="ne-p"><span class="ne-text">需要用收款主体账号去签约,账号要求必须是企业或者是个体工商户。</span></p>
<p id="ud284ce8a" class="ne-p"><span class="ne-text">可以直接通过 <span class="ne-text">👉<span class="ne-text"> <span class="ne-text">签约直通车</span><span class="ne-text"> 进行开通</span></span></span></span></p>
<p id="uf6f692ac" class="ne-p"><img width="500" id="uecc36237" class="ne-image lazyload" data-src="https://intranetproxy.alipay.com/skylark/lark/0/2023/png/136731/1701739316437-4978f00a-f873-49c7-8e9c-8ea2149589a0.png"></p>
<p id="ub6bd5c48" class="ne-p"> </p>
<h3 id="TDnuW"><span class="ne-text">账号与小程序账号绑定</span></h3>
<p id="ufd4e16f3" class="ne-p"><span class="ne-text">开通成功之后,要去 <span class="ne-text">小程序 AppID 管理</span><span class="ne-text"> 页面关联小程序,将开发的小程序关联到账号下。</span></span></p>
<p id="u432d6121" class="ne-p"><strong>⚠</strong><strong> 注意:哪个小程序开发就绑哪个小程序,不绑的话后面无法支付成功。</strong></p>
<p id="uf92d17bd" class="ne-p"><img width="1000" id="uc619ecaf" class="ne-image lazyload" data-src="https://intranetproxy.alipay.com/skylark/lark/0/2023/png/136731/1701743113874-a725bb25-40d5-481b-b103-ce2bd2b9053e.png"></p>
<p id="uc23a5405" class="ne-p"> </p>
<h3 id="noJPl"><span class="ne-text">小程序绑定JSAPI产品</span></h3>
<p id="u8722cdb4" class="ne-p"><span class="ne-text">要到小程序详情界面的【产品绑定】去绑 JSAPI 支付产品。</span></p>
<p id="ubfbfe5a6" class="ne-p"><span class="ne-text">可以参考 <span class="ne-text">👉<span class="ne-text"> [<span class="ne-text">应用如何实现产品绑定</span><span class="ne-text">] 进行操作:</span></span></span></span></p>
<p id="uc49e29bf" class="ne-p"><img width="1249.0908820175932" id="ud9d4271f" class="ne-image lazyload" data-src="https://intranetproxy.alipay.com/skylark/lark/0/2023/png/136731/1701755900337-7ed4b4d8-51c7-45ca-9158-ac628773afd9.png"></p>
<p id="u85411e9f" class="ne-p"> </p>
<p id="ub535463f" class="ne-p"><strong>签约过程中可能遇到的问题也给大家列在这里了,大家可以参考下~:</strong></p>
<ul class="ne-ul">
<li id="u44d0ae28" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">小程序功能列表中没有支付能力</span><span class="ne-text">]</span></span></li>
<li id="u24051f9d" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">个人小程序是否支持支付功能</span><span class="ne-text">]</span></span></li>
<li id="u7330f079" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">小程序支付签约要求</span><span class="ne-text">]</span></span></li>
</ul>
<p id="u8e9d93dc" class="ne-p"> </p>
<p id="u66ed8062" class="ne-p"><strong>小贴士 </strong><strong>📖</strong><strong>:</strong><span class="ne-text">账号不符合要求的也可以通过沙箱环境去测试下,可以参考之前写的这篇~</span></p>
<div class="ne-quote">
<blockquote>
<p id="u5a1bcb9d" class="ne-p"><strong>支付宝沙箱超详细教程+避雷经验,看这篇就够了</strong></p>
</blockquote>
</div>
<p id="u8c864deb" class="ne-p"> </p>
<h2 id="wKvOD"><span class="ne-text">支付调用整体流程</span></h2>
<p id="u65420f95" class="ne-p"><span class="ne-text">获取到权限之后我们就可以进行接口调用了,主要步骤分为 :</span></p>
<ul class="ne-ul">
<li id="u6bd6274b" data-lake-index-type="0"><strong>(前端+后端)获取用户的授权信息 </strong></li>
<li id="u0782570a" data-lake-index-type="0"><strong>(前端)将订单信息传到服务端 </strong></li>
<li id="u2a01f525" data-lake-index-type="0"><strong>(后端)服务端创建支付单 </strong></li>
<li id="u661637ad" data-lake-index-type="0"><strong>(前端)唤起支付</strong></li>
</ul>
<p id="uc59d862e" class="ne-p"> </p>
<h3 id="Ur0af"><span class="ne-text">第一步、获取用户的授权信息</span></h3>
<p id="u44bde234" class="ne-p"><strong>目的:</strong><span class="ne-text">这一步是为了能够获取到用户的 user_id(openid)</span></p>
<p id="u7edf34a0" class="ne-p"><strong><span class="ne-text">注意:</span></strong><span class="ne-text">user_id 和 openid 都是可以的,新老账号可能获取到的信息不一样,我之前老的账号获取到的是user_id,新申请的账号获取到的是 openid,根据大家的自己账号实际情况来看~</span></p>
<p id="uc85e0b1d" class="ne-p"><span class="ne-text">对此内容感兴趣的小伙伴也可以查看 <span class="ne-text">👉<span class="ne-text">[<span class="ne-text">openid 和 userid 的区别</span><span class="ne-text">]</span></span></span></span></p>
<h4 id="w9hV4"><span class="ne-text">方法一:通过用户授权获取(用户端有弹窗)</span></h4>
<p id="ub06e1ae7" class="ne-p"><span class="ne-text">大家可以参考我之前写的获取用户信息的 my.getAuthCode 步骤,下面简单概括下就是:</span></p>
<ul class="ne-ul">
<li id="ue79ec69f" data-lake-index-type="0"><span class="ne-text">前端通过 my.getAuthCode 方法获取到用户的授权 <strong>authCode </strong></span></li>
<li id="u6cec3502" data-lake-index-type="0"><span class="ne-text">将 <strong>authCode </strong><span class="ne-text">传到后端通过 <span class="ne-text">alipay.system.oauth.token</span><span class="ne-text"> 接口获取 <strong>access_token</strong><span class="ne-text"> 参数</span></span></span></span></li>
<li id="ued213a5b" data-lake-index-type="0"><span class="ne-text">后端用 <strong>access_token</strong><span class="ne-text"> 参数传入 <span class="ne-text">alipay.user.info.share</span><span class="ne-text"> 接口中获取到 <strong>user_id(openid)</strong></span></span></span></li>
</ul>
<h4 id="pWkUA"><span class="ne-text">方法二:通过静默授权获取(用户端无弹窗)</span></h4>
<p id="u949ef7e5" class="ne-p"><span class="ne-text">静默授权与用户授权同样是使用的 my.getAuthCode 方法,但是 <span class="ne-text">scopes <span class="ne-text">传参不同,获取到的信息 <strong>只有 uid(openid)</strong><span class="ne-text">,调用步骤为:</span></span></span></span></p>
<ul class="ne-ul">
<li id="ufc02477c" data-lake-index-type="0"><span class="ne-text">前端通过 my.getAuthCode 方法(scopes 入参 <strong>auth_base</strong><span class="ne-text">)获取到用户的授权 <strong>authCode </strong></span></span></li>
<li id="u9bb58f4c" data-lake-index-type="0"><span class="ne-text">将 <strong>authCode </strong><span class="ne-text">传到后端通过 <span class="ne-text">alipay.system.oauth.token</span><span class="ne-text"> 接口到 <strong>user_id(openid)</strong></span></span></span></li>
</ul>
<p id="ub98162ec" class="ne-p"><strong>代码示例</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">Page({
getAuthCode() {
my.getAuthCode({
scopes: </span>'auth_base',<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">静默授权</span>
success: res =><span style="color: rgba(0, 0, 0, 1)"> {
const authCode </span>=<span style="color: rgba(0, 0, 0, 1)"> res.authCode;
fail: err </span>=><span style="color: rgba(0, 0, 0, 1)"> {
console.log(</span>'my.getAuthCode 调用失败'<span style="color: rgba(0, 0, 0, 1)">, err)
}
});
}
})</span></pre>
</div>
<p> </p>
<div class="lake-content">
<p id="u4c0fc623" class="ne-p"><strong>授权这块的问题在上一篇</strong></p>
<ul>
<li id="u8b79ff91" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">小程序静默授权是否可以拿到用户头像昵称</span><span class="ne-text">]</span></span></li>
<li id="u2bc4d23e" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">支付宝小程序可以在首页获取到user_id吗</span><span class="ne-text">]</span></span></li>
</ul>
<p> </p>
</div>
<div class="lake-content">
<h3 id="ZyENj"><span class="ne-text">第二步、将订单信息传到服务端</span></h3>
<p id="u5734f5bb" class="ne-p"><span class="ne-text"> 用户信息获取到之后,我们就可以将订单信息和用户信息一起再打包,通过 my.request 传回服务端</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">.js页面</span>
<span style="color: rgba(0, 0, 0, 1)">Page({
pay(){
my.request({
url: </span>'商家服务端地址',<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">须加httpRequest域白名单</span>
method: 'POST'<span style="color: rgba(0, 0, 0, 1)">,
data: {</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">data里的key、value是开发者自定义的</span>
from: '支付宝'<span style="color: rgba(0, 0, 0, 1)">,
order: </span>'XXXXX',<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">订单信息</span>
<span style="color: rgba(0, 0, 0, 1)"> },
dataType: </span>'json'<span style="color: rgba(0, 0, 0, 1)">,
success: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(res) {
my.alert({content: </span>'success'<span style="color: rgba(0, 0, 0, 1)">});
},
fail: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(res) {
my.alert({content: </span>'fail'<span style="color: rgba(0, 0, 0, 1)">});
},
complete: </span><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(res) {
my.hideLoading();
my.alert({content: </span>'complete'<span style="color: rgba(0, 0, 0, 1)">});
}
});
}
});</span></pre>
</div>
<p id="uc4eb8fc6" class="ne-p"> </p>
<p id="ub41e745f" class="ne-p"><span class="ne-text">如果是在本地测试的话记得在 IDE 的【详情】里面把下面这两个校验勾选上,不然IDE会去校验域名的合法性的。</span></p>
<p id="u17941ab1" class="ne-p"><img width="452.7272629146736" id="u97da13e2" class="ne-image lazyload" data-src="https://intranetproxy.alipay.com/skylark/lark/0/2023/png/136731/1701758431755-d739bbbe-1fe0-4d6d-beed-5b76d436a7c9.png"></p>
<p id="u91771bbd" class="ne-p"> </p>
<p id="u891f2e26" class="ne-p"><strong>这边给大家汇总一些 my.request 调用过程中的常见问题:</strong></p>
<ul class="ne-ul">
<li id="uc08b8098" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">my.request API 可以使用 ip 地址访问吗</span><span class="ne-text">]</span></span></li>
<li id="u69b6bd4e" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">my.request 的 url 参数的域名是否需要配置白名单</span><span class="ne-text">]</span></span></li>
<li id="u069e8160" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">my.request 默认请求头</span><span class="ne-text">]</span></span></li>
<li id="u5301ebeb" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">my.request 默认请求超时是多久</span><span class="ne-text">]</span></span></li>
</ul>
<p id="u420ca36a" class="ne-p"> </p>
<h3 id="xBQxK"><span class="ne-text">第三步、服务端创建支付单</span></h3>
<p id="u7ccecf36" class="ne-p"><strong>目的:</strong><span class="ne-text">获取 trade_no(支付宝交易号)</span></p>
<p id="u988694e4" class="ne-p"><span class="ne-text">接收到前端传过来的订单信息之后,需要将信息传入 alipay.trade.create 接口中获取 trade_no。</span></p>
<p id="u179a7437" class="ne-p"><span class="ne-text">服务端的代码大家可以直接参考:<span class="ne-text">👉<span class="ne-text"> [<span class="ne-text">alipay.trade.create 代码示例</span><span class="ne-text">]</span></span></span></span></p>
<p id="uf49d3e20" class="ne-p"> </p>
<p id="u1f284195" class="ne-p"><span class="ne-text"><span class="ne-text">📌<span class="ne-text">下面简单列一下后端几个必传的参数:</span></span></span></p>
<ul class="ne-ul">
<li id="u1fea7835" data-lake-index-type="0"><strong>out_trade_no:</strong><span class="ne-text">商户端自定义订单号,需保证在商户端的唯一性。</span></li>
<li id="ua989b714" data-lake-index-type="0"><strong>total_amount:</strong><span class="ne-text">订单金额,单位元,精确到两位小数。</span></li>
<li id="u9f390ea9" data-lake-index-type="0"><strong>subject:</strong><span class="ne-text">订单标题,会在账单界面展示。</span></li>
<li id="u68e5f46c" data-lake-index-type="0"><strong>product_code:</strong><span class="ne-text">产品码,固定值 JSAPI_PAY。</span></li>
<li id="u838b7991" data-lake-index-type="0"><strong>op_app_id:</strong><span class="ne-text">传小程序appid。</span></li>
</ul>
<p id="u014ee3c8" class="ne-p"> </p>
<p id="ud499f6ae" class="ne-p"><span class="ne-text">如果获取到的是user_id,传入</span></p>
<ul class="ne-ul">
<li id="ua3f2d515" data-lake-index-type="0"><strong>buyer_id:</strong><span class="ne-text">传入之前获取到的user_id。</span></li>
</ul>
<p id="u4ea9cbee" class="ne-p"> </p>
<p id="u4760d149" class="ne-p"><span class="ne-text">如果获取到的是openid,传入</span></p>
<ul class="ne-ul">
<li id="u036d1f00" data-lake-index-type="0"><strong>buyer_open_id:</strong><span class="ne-text">传入之前获取到的openid。</span></li>
</ul>
<p id="ud6d7e800" class="ne-p"> </p>
<p id="ua1b2f566" class="ne-p"><span class="ne-text">后端接口调用成功之后就可以获取到 <strong>trade_no</strong><span class="ne-text"> 参数了:</span></span></p>
<p id="u468ad0e2" class="ne-p"><img width="1046.3636136843159" id="u346afbc1" class="ne-image lazyload" data-src="https://intranetproxy.alipay.com/skylark/lark/0/2023/png/136731/1701744290657-72b1ceb4-5cf8-49b4-955c-68729f2d6c50.png"></p>
<p id="ud40864f3" class="ne-p"> </p>
<p id="ub94c57bd" class="ne-p"><strong>服务端接口报错的常见问题如下:</strong></p>
<ul class="ne-ul">
<li id="u2d072be6" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">小程序支付报错:ACCESS_FORBIDDEN</span><span class="ne-text">]</span></span></li>
<li id="u22e6a769" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">小程序支付报错:本笔交易不支持在本小程序内支付请联系商户完成小程序 APPID 的绑定后再重新发起支付</span><span class="ne-text">]</span></span></li>
<li id="uedabad1d" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">ACQ.UNBOUND_APPLICATION(指定小程序主体未完成关联绑定)</span><span class="ne-text">]</span></span></li>
<li id="u82f751e0" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">小程序支付报错:支付失败,商家支付唤起方式不正确,请联系商家解决</span><span class="ne-text">]</span></span></li>
</ul>
<p id="uc242b14c" class="ne-p"> </p>
<h3 id="p9j9M"><span class="ne-text">第四步、唤起支付</span></h3>
<p id="uc9e0bc2b" class="ne-p"><span class="ne-text">前端获取到 <strong>trade_no</strong><span class="ne-text"> 之后,我们就可以通过 <span class="ne-text">my.tradePay(发起支付)</span><span class="ne-text"> 方法在小程序上唤起收银台了。</span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> .js</span>
<span style="color: rgba(0, 0, 0, 1)">my.tradePay({
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 传入支付宝交易号trade_no</span>
tradeNO: '201711152100110410533667792'<span style="color: rgba(0, 0, 0, 1)">,
success: (res) </span>=><span style="color: rgba(0, 0, 0, 1)"> {
my.alert({
content: JSON.stringify(res),
});
},
fail: (res) </span>=><span style="color: rgba(0, 0, 0, 1)"> {
my.alert({
content: JSON.stringify(res),
});
}
});</span></pre>
</div>
<p> </p>
<p id="ufbdf36c1" class="ne-p"><span class="ne-text">如果是 IDE 上测试的话,需要用支付宝扫码进行支付:</span></p>
<p id="u63b63ec3" class="ne-p"><img width="223" id="u6c7f2f21" class="ne-image lazyload" data-src="https://intranetproxy.alipay.com/skylark/lark/0/2023/png/136731/1701746705821-3e10f402-f7b8-43d2-a62f-7f5bf514ac13.png"></p>
<p id="u125cb1c1" class="ne-p"> </p>
<p id="u8fcd0584" class="ne-p"><span class="ne-text">真机测试可以直接唤起收银台进行支付:</span></p>
<p id="ua18b5d4a" class="ne-p"><img width="603" id="u8fc6f393" class="ne-image lazyload" data-src="https://intranetproxy.alipay.com/skylark/lark/0/2023/jpeg/136731/1701759175478-d6e8990b-ccc4-40bc-a7f8-cec95964b1c3.jpeg"></p>
<p id="u11538484" class="ne-p"> </p>
<p id="uf69d9aeb" class="ne-p"><strong>大家也可以看下支付过程中可能会遇到的一些问题~:</strong></p>
<ul class="ne-ul">
<li id="ubb78df4a" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">小程序前端跳转是否可以判断支付成功</span><span class="ne-text">]</span></span></li>
<li id="u85a6a910" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">小程序开发者工具是否在支持测试小程序支付功能</span><span class="ne-text">]</span></span></li>
<li id="u444e485c" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">小程序支付如何设置同步</span><span class="ne-text">]</span></span></li>
<li id="ub385b252" data-lake-index-type="0"><span class="ne-text">[<span class="ne-text">小程序支付报错:当面付等产品不支持在小程序场景内使用,请联系商户更换收单产品后再重新发起支付</span><span class="ne-text">]</span></span></li>
</ul>
<p id="u805bbcb8" class="ne-p"> </p>
<p id="uc9e4bddc" class="ne-p"><span class="ne-text">以上就是小程序支付的所有内容了,希望能够帮助到你*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。</span></p>
</div>
<p id="u4c0fc623" class="ne-p"><strong> </strong></p>
</div><br><br>
来源:https://www.cnblogs.com/yjdmx/p/17878831.html
頁:
[1]