194.Vue.js智能扫码点餐系统(二十八)【支付宝支付流程、Nodejs支付源码解析、 实现支付功能(支付宝支付)】2019.04.01
0、知识点
- 支付宝支付流程
1、支付宝支付流程
- 官方支付流程文档:https://docs.open.alipay.com/203/107084/
- 手机网站支付首页
- 手机网站支付 -> 快速接入
- 调用流程
- Vue支付流程
- 手机网站支付首页
2、Nodejs 支付宝支付 sdk alipay-mobile
- 使用浏览器支付页面
-
支付成功返回到网站的首页
-
使用手机支付页面
-
支付成功返回到网站的首页
-
nodejs 后台api接口
/**
* Created by Administrator on 2019/4/01 0020.
*/
var router=require('koa-router')();
const DB=require('../module/db.js');
const config=require('../module/config.js');
const tools=require('../module/tools.js');
const feiyun=require('../module/feiyun.js');
//支付宝
const Alipay = require('alipay-mobile');
const assert=require('assert');
router.get('/doPay',(ctx)=>{
//appPrivKeyFile 本地生成的
// alipayPubKeyFile: 蚂蚁金服公钥 支付宝公钥
const options = {
app_id: '2017122101048570', // app_id 是你申请账号的时候获得的
appPrivKeyFile: "MIIEowIBAAKCAQEA2YqSo7uX27Fdi32MEx2hAmfZUWl19KNovLLEm3P6mlQYkD7+ThVE8468n8meyTBl2QC8YXQVbGANbFdwdcxldDnOUKv7f9VFiaXn+jT0t9hJ00t5HLJ2yY85hMWFhuO+wxIjZdJ82u4dekY7F2T32wC7qIx4dsncPVfCvW4nB8Co6+eVi+PBEkp92HiBk/b4HbjhZxBCe9urbiN9syO5ZlVzAPUDcDvlRVSICv0S9BzWCQPjzxO8sd6jvJ/EFBmbz9VjvFbOkwSoibElY7kShDtAR2Ae/PTzEF2hvOUKVI/hW7T2p7VewgYF1kcPxlLoZJ8Zljxn7EYhMmsfukbPHQIDAQABAoIBAHPUS9XwWaA5ZTSTiZTYDtXoE5c8jvjOVUM78GFRNJsdseKEGAXdX1RLqPVvdiNrqJ8NvEArfgixcBRCznd6eH6VFNxxZj0fgqIS+1yG+9Iz0MM3iWoVQBh8MUUXosw60WSucLiThbVQWdO0N1xyf2JVlpXdDXs6ahEjfGY+k3uVR0No0qIBgwirM2Ofyk3orgBFxXgEbjpoAindpglrqhw2LlMMNb9wwNkjzB/guiYhRu3xOoodstPqcR/FXy0WLRc6W+pxF83E7lPJ22U3DLM2yIc4NQjGxa8Kfkhm0fQUQz5M1akRfk0nj6w8sIjd5XJKgw+Cjosh4EubHVptpyUCgYEA8DzEleQo01hdZqHLeYBghbuEuoFm+N80Xk/7i4Dxlny2R4ZO/sCH3ZURbwcI4kA2WvdScB2Lir9NI10HJNW3xJRjVpumPzfrNxLoYZb+2h0eSS6peIlMAidZyspwGEwLE+jelnMQu8IVbKQ0aTN8tjpKolbpII95Tlq58Ijf8ksCgYEA59CVDkNU+dCufVnLHkOASrd0AGmXMccKeBZfpNlZIdmH9/KBRbXiUec8TWgDwfZg8e//FMCA7r4Y4pj2XZhb+G0M3FfBf2hjKjkqVDEv9+3zYK4zI07ts2WRvkLgY+SvzFYwSEo/U72zka1ocWdDZtiNdXqqAC5DTTc6zIIsozcCgYBPDdAq+v+sPIHPyiIpA2O/3isZLIf0EY8sEenWyEG3oaZh9wJ7tmN/ORSZkpkLytGYMZbBKhfHOphpsK0vI9zrJWFjGKkmWIJghypNIuEOaVKUBnTiI1wNwWE86Ezm0e87SAAnRgoVnxJpw8czbyv0003ICg2BF3V1oUlaq8/17QKBgAD+cvUpsr6Td3wQG3/YuD8ZxESQL1bGTLQxHF3flLNBdITKpGVBH2RMgoSucn2tacL/zW8wWB0t8XtfPocuNQ6+oPR859Z9AxfWQOk1gMgmXAnJFW0MVJaVU+el78Jd46cTo4db0iOwx4lTXgRGdhKF0S10xi/UAvPczcK8uCZHAoGBAN+74UouDYmZaAfzj5O0857ZVHBiXtJ5AasYqbBALZ17EqTjscYcD3nlvWhoX7JtGAyU09fuH23NK6hpi3yk67KUBuJOab+wjjDUIIAveFqjmiaV+Ra727v39d2ide534ikOfz04RDiAUVA43V+a3kdaAXuvTfhF+mczjN3joFtm",
alipayPubKeyFile: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhb/KlxYfhRE8KRp92MQM8ZB8NVjoM9LYFOnPIuNtcMZVA8ld7ybDP2FiA+QEE7wLGqMImwl1Y4xzkrTLCjHVC8fdR8ZvzZR2I3ZOrARerI9+RbkCfT+7YLv55+A+WTHEyiB+v7PfXVTT28s0CHNLPXMyQD1u8UVEQEpbMSs8hH3pJF55Li7kc5VvJpV3RVO9TXZTVAA5mSp9FvO3u+47IJDgFVLnqqHh6ETL1nHVpxiAY2LGer+RWpVYD8v+We+VWsrfJP7bO0xr2pwizldepo8YNYPgcIAIwd7KiveypL1pA0xWgSjUHzrkVh1j/nSnvJgKSdydU/VRcaVt/Mt8wwIDAQAB"
}
const service = new Alipay(options);
const data = {
subject: 'aaa',
out_trade_no:'1234222232532235',
total_amount: '0.1'
}
const basicParams = {
"return_url": 'http://a.itying.com', // 支付成功后,跳转到的页面
//异步通知地址,通知后台更新订单
"notify_url": "http://a.itying.com/api/alipayNotify",
}
return service.createWebOrderURL(data, basicParams)
.then(result => {
assert(result.code == 0, result.message)
assert(result.message == 'success', result.message)
console.log(result);
// ctx.body={"title":result};
ctx.redirect(result.data);
})
})
// 异步更新订单
router.post('/alipayNotify',async ctx=>{
// var data=ctx.request.body;
// console.log(ctx.request.body);
const options =config.aliPayOptions
const service = new Alipay(options);
const params = ctx.request.body;
const result = await service.makeNotifyResponse(params);
if(result.code==0){
console.log('success');
ctx.body='success';
}
})
//商品列表
router.get('/productlist',async ctx=>{
var pcate=await DB.find('productcate',{},{'_id':1,"title":1,"pid":1});
var product=await DB.find('product',{},{'_id':1,'cate_id':1,'catename':1,'title':1,'price':1,'img_url':1});
for(var i=0;i<pcate.length;i++){
pcate[i].list=[];
for(var j=0;j<product.length;j++){
if(pcate[i]._id==product[j].cate_id){
pcate[i].list.push(product[j]);
}
}
}
ctx.body={"result":pcate};
})
//商品详情
router.get('/productcontent',async ctx=>{
try{
var id=ctx.query.id;
var product=await DB.find('product',{'_id':DB.getObjectId(id)});
ctx.body={"result":product};
}catch(err){
ctx.body={"result":'',"err":err};
}
})
//购物车 koa2
router.post('/addcart',async ctx=>{
var data=ctx.request.body;
//console.log(data);
try{
var uid=data.uid;
var product_id=data.product_id;
var num=data.num;
var hasData=await DB.find('cart',{'uid':uid,'product_id':product_id});
if(hasData.length>0){
await DB.update('cart',{'uid':uid,'product_id':product_id},{'num':hasData[0].num+num})
}else{
var result=await DB.insert('cart',data);
}
ctx.body={"success":'true',"msg":"增加数据成功"};
}catch(err){
ctx.body={"success":'false',"msg":"增加数据失败"};
}
})
//购物车
router.get('/cartlist',async ctx=>{
var uid=ctx.query.uid;
var result=await DB.find('cart',{'uid':uid});
ctx.body={"success":'true',"result":result};
})
//增加购物车数据
router.get('/incCart',async ctx=>{
var uid=ctx.query.uid;
var product_id=ctx.query.product_id;
var num=parseInt(ctx.query.num);
var result=await DB.update('cart',{'uid':uid,'product_id':product_id},{"num":num+1});
ctx.body={"success":true};
})
//减少购物车数据
router.get('/decCart',async ctx=>{
var uid=ctx.query.uid;
var product_id=ctx.query.product_id;
var num=parseInt(ctx.query.num);
if(num<=1){
var result=await DB.remove('cart',{'uid':uid,'product_id':product_id});
}else{
var result=await DB.update('cart',{'uid':uid,'product_id':product_id},{"num":num-1});
}
ctx.body={"success":true};
})
//获取购物车数量
router.get('/cartCount',async ctx=>{
var uid=ctx.query.uid;
var result=await DB.find('cart',{'uid':uid});
//console.log(result);
var sum=0;
for(var i=0;i<result.length;i++){
sum+=result[i].num;
}
ctx.body={"success":true,"result":sum};
})
router.get('/focus',(ctx)=>{
ctx.body={"title":"这是一个轮播图的api"};
})
//增加用户餐位信息
router.post('/addPeopleInfo',async ctx=>{
var data=ctx.request.body;
//console.log(data);
try{
var uid=data.uid;
var p_num=data.p_num;
var p_mark=data.p_mark;
var hasData=await DB.find('peopleinfo',{'uid':uid});
if(hasData.length>0){
await DB.update('peopleinfo',{'uid':uid},{'p_num':p_num,'p_mark':p_mark})
}else{
var result=await DB.insert('peopleinfo',data);
}
ctx.body={"success":'true',"msg":"增加数据成功"};
}catch(err){
ctx.body={"success":'false',"msg":"增加数据失败"};
}
})
//用餐人数列表
router.get('/peopleInfoList',async ctx=>{
var uid=ctx.query.uid;
var result=await DB.find('peopleinfo',{'uid':uid});
ctx.body={"success":'true',"result":result};
})
//提交订单
router.post('/addOrder',async ctx=>{
var data=ctx.request.body;
console.log(data);
try{
//获取数据
var uid=data.uid;
var p_num=data.p_num;
var p_mark=data.p_mark; /*备注口味信息*/
var order= ctx.request.body.order?JSON.parse( ctx.request.body.order):''; /*菜品信息*/
var order_id=tools.getOrderId();
var total_price=data.total_price;
var total_num=data.total_num;
var order_status=0; //0表示 未确认 1 表示已经确认 2表示取消
var pay_status=0; //0表示未支付 1表示已经支付
//var pay_type=data.pay_type; 1 微信支付 2支付宝
var d=new Date();
//判断当前桌子下面有没有 没有取消并且未支付的订单 如果有的话更新 没有增加
var shopOrderResult=await DB.find('shop_order',{"uid":uid,"order_status":{ $not:/2/},"pay_status":0});
if(shopOrderResult.length>0){/*更新订单*/
//增加订单主表
var shop_order_result=await DB.update('shop_order',{"uid":uid,"order_status":{ $not:/2/},"pay_status":0},{
total_num:total_num+shopOrderResult[0].total_num,
total_price:total_price+shopOrderResult[0].total_price
})
for(var i=0;i<order.length;i++){
await DB.insert('shop_order_item',{
order_id: shopOrderResult[0]._id.toString(),
title:order[i].title,
price:order[i].price,
num:order[i].num,
status:1 /*状态是1 表示已经下厨 状态是2表示退菜*/
})
}
}else{/*增加订单*/
//增加订单主表
var shop_order_result=await DB.insert('shop_order',{
uid:uid,
p_num:p_num,
p_mark,
order_id,
total_num,
total_price,
pay_status,
order_status,
add_time:d.getTime()
})
//增加订单二级表
if(shop_order_result.insertedId){
//[{"_id":"5ac2e79b127ca21160ffe32a","shop_id":"5ac079f7b3c2d439307e78fa","cate_id":"5ac089e4a880f20358495509","title":"东鹏特饮2018年世界杯传播","price":"2.8","description":"规格:250ml/瓶","num":2},{"_id":"5ac0f69329debd46cc594b42","shop_id":"5ac080399406da3ebc502238","cate_id":"5ac089e4a880f20358495509","title":"农夫山泉东方树叶茉莉花茶500ml","price":"4.5","description":"规格:500ml/瓶","num":11}]
for(var i=0;i<order.length;i++){
await DB.insert('shop_order_item',{
order_id: shop_order_result.insertedId.toString(),
title:order[i].title,
price:order[i].price,
num:order[i].num,
status:1 /*状态是1 表示已经下厨 状态是2表示退菜*/
})
}
}
ctx.body={"success":'true',result:{ /*返回生成的订单号*/
order_id:order_id
}}
}
//打印小票
var orderInfo=tools.getOrderPrintInfo(total_price,p_mark,uid,order);
feiyun.print('918502453',orderInfo);
//清空购物车数据
await DB.remove('cart',{"uid":uid});
ctx.body={"success":'true',"msg":"增加数据成功"};
}catch(err){
ctx.body={"success":'false',"msg":"增加数据失败"};
}
})
//获取用户的订单信息
router.get('/getOrder',async ctx=>{
var uid=ctx.query.uid;
try{
var orderResult=await DB.find('shop_order',{"uid":uid,"order_status":{ $not:/2/},"pay_status":0});
var orderItemResult=await DB.find('shop_order_item',{"order_id":orderResult[0]._id.toString()});
orderResult[0]['items']=orderItemResult;
ctx.body={"success":'true','result':orderResult};
}catch(e){
ctx.body={"success":'false','message':'非法请求'};
}
})
module.exports=router.routes();