上一篇笔记介绍了微信支付的详细步骤:商业微信小程序开发:小白轻松接单(微信支付)_微信小程序快速接单-CSDN博客
那么这篇笔记将介绍一下微信的退款功能
1、商户端创建云函数处理退款
1、如果要用商户端进行退款,则需要在商户端的云开发控制台中与商户号进行绑定(怎么绑定,同样参考上篇笔记---微信支付)
2、在商户端微信开发者工具中新建一个nodejs云函数refund
3、在同级目录下创建一个public.js文件来生成所需的随机字符串
1.1、public.js
let nonceStr = function(){
let chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'
let maxPos = chars.length
let res = ''
for(let i=0;i<32;i++){
res+=chars.charAt(Math.floor(Math.random()*maxPos))
}
return res
}
// 退款单号
let ouTrefundno = function(){
let chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_-'
let maxPos = chars.length
let res = ''
for(let i=0;i<40;i++){
res+=chars.charAt(Math.floor(Math.random()*maxPos))
}
return res
}
module.exports = {nonceStr,ouTrefundno}
1.2、refund云函数
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境
var {nonceStr,ouTrefundno} = require('./public.js')
// 云函数入口函数 :退款申请
exports.main = async (event, context) => {
const res = await cloud.cloudPay.refund({
functionName:'paycallback',
envId:'填写自己的云环境id',
sub_mch_id:'1669895289',
nonce_str:nonceStr(),
out_trade_no:event.out_trade_no,//前端传来的商户订单号
out_refund_no:ouTrefundno(),//商户退款单号
total_fee:event.total_fee*100,//订单金额
refund_fee:event.refund_fee*100//申请退款金额
})
if(res.returnCode == 'SUCCESS' && res.resultCode == 'SUCCESS'){
// 申请退款成功
return {code:200,msg:'退款申请成功',out_refund_no:res.outRefundNo}
}else{
// 申请退款失败
return {code:4001,msg:'退款申请失败',errCodeDes:res}
}
}
2 、商户端创建云函数查询退款
1、创建云函数queryRefund并创建public.js来生成随机字符串
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 使用当前云环境
var {nonceStr} = require('./public.js')
// 云函数入口函数
exports.main = async (event, context) => {
const res = await cloud.cloudPay.queryRefund({
sub_mch_id:'1669895289',
nonce_str:nonceStr(),
out_refund_no:event.out_refund_no//商户退款单号
})
if(res.returnCode == 'SUCCESS'){
if(res.resultCode == 'SUCCESS'){
return {msg:'退款成功'}
}else{
return {msg:'退款处理中'}
}
}else{
return {msg:'退款失败',error:res}
}
}
3、在商户端的app.vue文件中配置云环境
export default {
onLaunch: function() {
wx.cloud.init({
env:'改成自己的云环境id',
traceUser:true,
})
},
}
实现退款按钮的逻辑
async function refund_sure(){
let DB = await inIt()
const res = await wx.cloud.callFunction({name:'refund',data:{
out_trade_no:jy_data.data.out_trade_no,
total_fee:jy_data.data.total_price*0.0001,
refund_fee:jy_data.data.refund_price*0.0001
}})
// console.log(jy_data.data)
console.log(res)
if(res.result.code == 200){ //退款成功
await DB.database().collection('huiyuan').where({_id:jy_data.data._id}).update({data:{
deliver:'ref_succ',
out_refund_no:res.result.out_refund_no
}})
new Feedback(res.result.msg,'none').toast()
jy_data.data.deliver='ref_succ'
back_item.type = 'yue'
wx.navigateTo({
url:'/pages/order/order'
})
}else{
new Feedback(res.result.errCodeDes.errCodeDes,'none').toast()
}
}
可以体验一下完整项目(这仅仅是个示例小程序,商品是虚拟产品,不要支付哈,由于不会一直盯着后台,退款可能不及时。)