简介

接口引擎与第三方平台对接无所不能,下一篇介绍对接微信支付回调(含签名验证)

预览图

在这里插入图片描述

业务逻辑

  • 参考微信支付官方文档:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_1.shtml
  • 必传:ProductId(商品Id,用于根据商品Id查询出 商品名称、商品价格)
  • 新增订单信息,拿到订单编号(订单编号一般为【自动编号】控件,平台内置分布式锁保证唯一性)
  • 写日志
  • 生成微信需要的加密请求头
  • 向微信发起请求
  • 上一步成功后修改订单信息:回写统一下单结果
  • 返回一些前端发起支付需要的值

接口引擎代码

//参数
var appid = V8.SysConfig.MiniProgramAppId;//小程序 appid
var mchid = V8.SysConfig.WeChatMchId;//商户Id
var serialNo = V8.SysConfig.CertSerialNo;//商户API证书序列号serial_no,用于声明所使用的证书
var privateKey = V8.SysConfig.WxPayPrivateKey;//私书私有key
var oepnId = 'ouVQI46Ckf_WzhYnjGIvtvzC2nwo';//V8.CurrentUser.MiniProgramOpenId;//'ouVQI46Ckf_WzhYnjGIvtvzC2nwo';//
var notify_url = 'https://api.microios.com/apiengine/wxpay-notify';//用户支付成功后回调地址,由接口引擎实现
var jsapiUrl = 'https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi';//腾讯官方下单地址,固定url
var jsapiUrlSimple = '/v3/pay/transactions/jsapi';//腾讯官方下单地址,固定url
var currentUser = V8.CurrentUser;
//参数校验
if(!appid || !mchid || !serialNo || !privateKey){
  V8.Result = { Code : 0, Msg : '支付配置有误!' }; return;
}
if(!oepnId){
  V8.Result = { Code : 0, Msg : '未找到当前登录用户小程序oepnid,无法发起支付!' }; return;
}
//获取商品信息,根据商品Id查询出 商品名称、商品价格
if(!V8.Param.ProductId){
	V8.Result = { Code : 0, Msg : '未传入商品Id' }; return;
}
var productResult = V8.FormEngine.GetFormData({
  FormEngineKey : 'diy_vip_level',
  Id : V8.Param.ProductId
});
if(productResult.Code != 1){
  V8.Result = { Code : 0, Msg : '获取商品信息失败:' + productResult.Msg;}; return;
}
var productModel = productResult.Data;
var productName  = productModel.Mingcheng;//商品名称。1-127位
var productPrice  = parseInt(productModel.HuiyuanJG * 100);//商品价格,单位为分,必须整数int类型

//新增订单信息,拿到订单编号(订单编号一般为【自动编号】控件,平台内置分布式锁保证唯一性)
var orderResult = V8.FormEngine.AddFormData({
  FormEngineKey : 'diy_vip_order',
  _RowModel : {
    DingdanBH : '',//订单编号,自动生成
    ShangpinMC : productModel.Mingcheng,//商品名称
    ShangpinID : productModel.Id,//商品Id
    DingdanJE : productModel.HuiyuanJG,//订单金额
    HuiyuanZH : currentUser.Account,
    HuiyuanMC : currentUser.Name,
    HuiyuanID : currentUser.Id,
    ShifouYZF : 0,//是否已支付
  }
});
if(orderResult.Code != 1){
  V8.Result = { Code : 0, Msg : '生成订单信息失败:' + orderResult.Msg;}; return;
}
//订单编号。6-32位。需要是字符串。
var orderNo = orderResult.Data.DingdanBH;//new Date().getTime().toString();
var payParam = {
	"mchid": mchid,//支付商户Id
	"out_trade_no": orderNo,//商户订单号
	"appid": appid,//小程序 appid
	"description": productName,//商品描述
	"notify_url": notify_url,//回调地址,由接口引擎实现
	"amount": {
		"total": productPrice,//订单总金额,单位为分。
		"currency": "CNY"//固定值
	},
	"payer": {
		"openid": oepnId//用户的openid
	}
};
//写日志
var addLogResult = V8.FormEngine.AddFormData({
	FormEngineKey : 'diy_important_log',
	_RowModel : {
		RizhiMC : '微信v3支付JSAPI下单',
		RizhiLB : '下单参数',
		RizhiNR : JSON.stringify(payParam),
		GuanlianID : orderNo,//orderResult.Data.Id
	}
});

V8.Result = `mchid:${mchid}, serialNo:${serialNo}, privateKey:${privateKey}, jsapiUrlSimple:${jsapiUrlSimple}, payParam:${JSON.stringify(payParam)}`;
return;

//生成微信需要的加密请求头
var headers = {
	Authorization : V8.Method.GetWeChatAuthorization(mchid, serialNo, privateKey, jsapiUrlSimple, JSON.stringify(payParam));
};
//向微信发起请求
var httpResult = V8.http.Post({
  Url : jsapiUrl,
	//注意:接口引擎目前有个暂未解决的bug:
	//参数传入int类型的值,接口引擎会序列化成浮点类型,这将导致微信参数验证不通过
	//所以使用PostParamString参数,提前序列化好。
  //PostParam: payParam,
	PostParamString : JSON.stringify(payParam),
	ParamType : 'JSON',//这里的'json'不区分大小写
	Headers : headers
});

var httpResultObj = JSON.parse(httpResult);

//修改订单信息:回写统一下单结果
V8.FormEngine.UptFormData({
  FormEngineKey : 'diy_vip_order',
  Id : orderResult.Data.Id,
  _RowModel : {
    TongyiXDJG : httpResult,
    TongyiXDCG : httpResultObj.prepay_id ? 1 : 0
  }
});

//如果不存在prepay_id,以DosResult标准格式返回错误结果到前端
if(!httpResultObj.prepay_id){
  V8.Result = { Code : 0, Data : httpResultObj, Msg : httpResultObj.message };
}else{
	//返回一些前端发起支付需要的值
	//签名,使用字段appId、timeStamp、nonceStr、package计算得出的签名值
	httpResultObj.appid = appid;//小程序appid
	httpResultObj.timeStamp = V8.Method.GetTimestamp().toString();//秒时间戳
	httpResultObj.nonceStr = System.IO.Path.GetRandomFileName();//随机字符串
	httpResultObj.package = 'prepay_id=' + httpResultObj.prepay_id;//prepay_id
	//微信签名
	httpResultObj.paySign = V8.Method.GetWeChatSign(privateKey, [appid, httpResultObj.timeStamp, httpResultObj.nonceStr, httpResultObj.package]);
  V8.Result = { Code : 1, Data :  httpResultObj};//这里不用返回Data
}

Microi吾码-系列文档

接口引擎实战-系列文档

Logo

低代码爱好者的网上家园

更多推荐