Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
5
51business
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
方斌
51business
Commits
3eea291f
Commit
3eea291f
authored
Sep 10, 2019
by
李尚科
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
weixin pay fix
parent
f8dbaabb
Pipeline
#13578
passed with stage
in 32 seconds
Changes
4
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
132 additions
and
97 deletions
+132
-97
order.js
app/controller/credit/order.js
+7
-5
credit.js
app/router/credit.js
+6
-4
common.js
app/service/credit/common.js
+34
-87
order.js
app/service/credit/order.js
+85
-1
No files found.
app/controller/credit/order.js
View file @
3eea291f
...
...
@@ -32,7 +32,7 @@ class OrderController extends Controller {
const
{
ctx
}
=
this
;
const
order_id
=
ctx
.
params
.
order_id
;
const
result
=
await
ctx
.
service
.
credit
.
common
.
unifiedOrder
(
'wexin'
,
order_id
);
const
result
=
await
ctx
.
service
.
credit
.
order
.
unifiedOrder
(
'wexin'
,
order_id
);
ctx
.
success
({
result
});
}
...
...
@@ -53,21 +53,23 @@ class OrderController extends Controller {
const
ret_obj
=
await
ctx
.
helper
.
xmlTojson
(
getxml
);
ctx
.
logger
.
info
({
notice_params
:
ret_obj
});
const
ret
=
await
ctx
.
service
.
credit
.
common
.
WexinNotify
(
ret_obj
);
ctx
.
success
({
ret_obj
,
ret
});
if
(
ret
)
{
ctx
.
success
(
"<xml><return_code>SUCCESS</return_code><return_msg>OK</return_msg></xml>"
);
return
;
}
ctx
.
success
(
"<xml><return_code>FAIL</return_code><return_msg>UNKONW</return_msg></xml>"
);
return
;
ctx
.
success
(
"<xml><return_code>SUCCESS</return_code><return_msg>OK</return_msg></xml>"
);
}
async
checkPay
()
{
const
{
ctx
}
=
this
;
const
order_id
=
ctx
.
params
.
order_id
;
const
is_pay
=
ctx
.
service
.
credit
.
order
.
checkOrderPay
(
order_id
);
const
is_pay
=
await
ctx
.
service
.
credit
.
order
.
checkOrderPay
(
order_id
);
let
result
=
false
;
if
(
is_pay
)
{
result
=
true
;
}
ctx
.
success
({
result
});
}
...
...
app/router/credit.js
View file @
3eea291f
...
...
@@ -3,10 +3,12 @@
module
.
exports
=
app
=>
{
const
router
=
app
.
router
.
namespace
(
app
.
config
.
projectRootPath
+
'/credit'
);
router
.
get
(
'third'
,
'/home'
,
'credit.order.getMyCredit'
);
router
.
get
(
'third'
,
'/history/:type'
,
'credit.order.getRecord'
);
router
.
get
(
'third'
,
'/order/pay/:order_id'
,
'credit.order.payOrder'
);
router
.
post
(
'third'
,
'/order/pay_notice'
,
'credit.order.payNotice'
);
router
.
get
(
'/home'
,
'credit.order.getMyCredit'
);
router
.
get
(
'/history/:type'
,
'credit.order.getRecord'
);
router
.
post
(
'/order/pay/:order_id'
,
'credit.order.payOrder'
);
router
.
get
(
'/order/pay/:order_id'
,
'credit.order.payOrder'
);
router
.
post
(
'/order/pay_notice'
,
'credit.order.payNotice'
);
router
.
get
(
'/order/check_pay/:order_id'
,
'credit.order.checkPay'
);
//我的信用-黑名单报告
router
.
get
(
'/blacklist/report/:report_id'
,
'credit.blacklist.getBlacklistReport'
);
//获取报告信息
...
...
app/service/credit/common.js
View file @
3eea291f
...
...
@@ -64,66 +64,21 @@ class CommonService extends Service {
return
sign
;
}
async
unifiedOrder
(
type
,
order_id
)
{
const
{
ctx
}
=
this
;
const
order
=
await
ctx
.
service
.
credit
.
order
.
getOrderInfo
(
order_id
);
const
price
=
order
.
price
*
100
-
order
.
preferential_price
*
100
;
console
.
info
(
price
);
if
(
price
<=
0
)
{
ctx
.
failed
(
'error price'
);
}
if
(
type
===
'wexin'
)
{
let
body
=
'黑名单报告检测支付'
;
if
(
order
.
type
===
2
)
{
body
=
'个人通话风险检测支付'
;
}
const
data
=
{
body
,
order_id
,
trade_no
:
moment
().
valueOf
()
+
ctx
.
helper
.
PrefixInteger
(
order_id
,
11
),
total_fee
:
price
,
notify_url
:
''
,
product_id
:
order
.
order_no
,
scene_info
:
{
h5_info
:
{
type
:
'Wap'
,
wap_url
:
this
.
config
.
PHP_URL
,
wap_name
:
'我的信用'
},
},
};
const
ret
=
await
this
.
WexinUnifiedOrder
(
data
);
const
pay_data
=
{
order_id
,
trade_no
:
data
.
trade_no
,
description
:
data
.
body
,
prepay_id
:
ret
.
prepay_id
||
0
,
amount
:
data
.
total_fee
,
unifiedorder_result
:
JSON
.
stringify
(
ret
),
client_ip
:
ctx
.
helper
.
getClientIP
(),
};
await
this
.
addCreditPay
(
pay_data
);
return
{
url
:
ret
.
mweb_url
,
order_id
:
order_id
,
trade_no
:
data
.
trade_no
};
}
else
if
(
type
===
'alipay'
)
{
//TODO
}
return
false
;
}
async
WexinUnifiedOrder
(
params
)
{
const
{
ctx
}
=
this
;
const
{
body
,
trade_no
,
total_fee
,
notify_url
,
product_id
,
scene_info
}
=
params
;
const
appid
=
''
;
const
mch_id
=
''
;
const
appid
=
this
.
config
.
MCH_APPID
;
const
mch_id
=
this
.
config
.
MCH_ID
;
const
trade_type
=
'MWEB'
;
const
nonce_str
=
ctx
.
helper
.
createNoncestr
();
const
spbill_create_ip
=
ctx
.
helper
.
getClientIP
();
// const spbill_create_ip = ctx.helper.getClientIP();
const
spbill_create_ip
=
'122.224.130.226'
;
let
json_data
=
{
appid
,
mch_id
,
body
,
trade_no
,
out_trade_no
:
trade_no
,
total_fee
,
spbill_create_ip
,
notify_url
,
...
...
@@ -135,9 +90,10 @@ class CommonService extends Service {
const
sign
=
this
.
getWexinSign
(
json_data
);
json_data
.
sign
=
sign
;
const
xml_data
=
ctx
.
helper
.
jsonToxml
(
json_data
);
console
.
info
(
xml_data
);
const
url
=
'https://api.mch.weixin.qq.com/pay/unifiedorder'
;
const
result_wexin
=
await
ctx
.
curl
(
url
,
{
timeout
:
3000
,
method
:
'POST'
,
data
:
xml_data
,
headers
:
{
'content-type'
:
'text/html'
,
},
streaming
:
false
,
dataType
:
'text'
,
});
console
.
info
(
result_wexin
);
const
result_wexin
=
await
ctx
.
curl
(
url
,
{
timeout
:
3000
,
method
:
'POST'
,
data
:
xml_data
,
});
if
(
result_wexin
.
status
!==
200
)
{
ctx
.
failed
(
'wexin pay failed'
);
}
...
...
@@ -150,34 +106,16 @@ class CommonService extends Service {
let
error_msg
=
'wexin pay error'
;
if
(
!
ret
.
return_code
||
ret
.
return_code
!==
'SUCCESS'
)
{
error_msg
=
ret
.
return_msg
||
error_msg
;
//
ctx.failed(error_msg);
ctx
.
failed
(
error_msg
);
}
if
(
!
ret
.
result_code
||
ret
.
result_code
!==
'SUCCESS'
)
{
error_msg
=
ret
.
err_code_des
||
error_msg
;
//
ctx.failed(error_msg);
ctx
.
failed
(
error_msg
);
}
return
ret
;
}
async
addCreditPay
(
params
)
{
const
{
ctx
}
=
this
;
const
{
order_id
,
trade_no
,
prepay_id
,
amount
,
description
,
unifiedorder_result
,
client_ip
}
=
params
;
const
data
=
{
order_id
,
trade_no
,
prepay_id
,
amount
,
description
,
unifiedorder_result
,
client_ip
,
}
const
ret
=
await
ctx
.
prometheusModel
.
CreditPay
.
add
(
data
);
return
ret
;
}
async
alipay
()
{
}
...
...
@@ -186,11 +124,14 @@ class CommonService extends Service {
const
{
ctx
}
=
this
;
const
{
transaction_id
,
trade_no
}
=
params
;
const
pay_info
=
await
ctx
.
prometheusModel
.
CreditPay
.
one
({
where
:
{
trade_no
:
out_trade_no
}
});
if
(
!
pay_info
||
pay_info
.
order_id
)
{
if
(
!
transaction_id
&&
!
trade_no
)
{
return
false
;
}
const
pay_info
=
await
ctx
.
prometheusModel
.
CreditPay
.
one
({
where
:
{
trade_no
}
});
if
(
!
pay_info
||
!
pay_info
.
order_id
)
{
ctx
.
failed
(
'pay info error'
);
}
const
order_info
=
await
ctx
.
service
.
credit
.
common
.
getOrderInfo
(
pay_info
.
order_id
);
const
order_info
=
await
ctx
.
service
.
credit
.
order
.
getOrderInfo
(
pay_info
.
order_id
);
const
nonce_str
=
ctx
.
helper
.
createNoncestr
();
const
url
=
'https://api.mch.weixin.qq.com/pay/orderquery'
;
let
data_obj
=
{
...
...
@@ -206,17 +147,22 @@ class CommonService extends Service {
const
xml_data
=
ctx
.
helper
.
jsonToxml
(
data_obj
);
const
result_wexin
=
await
ctx
.
curl
(
url
,
{
timeout
:
3000
,
method
:
'POST'
,
data
:
xml_data
,
headers
:
{
'content-type'
:
'text/html'
,
},
streaming
:
false
,
dataType
:
'text'
,
});
if
(
result_wexin
.
status
)
{
if
(
result_wexin
.
status
!==
200
)
{
ctx
.
failed
(
'wexin orderquery error1'
);
}
const
ret
=
await
ctx
.
helper
.
xmlTojson
(
result_wexin
.
data
);
if
(
ret
.
return_code
!==
'SUCCESS'
&&
ret
.
result_code
!==
'SUCCESS'
)
{
ctx
.
failed
(
'wexin orderquery error2'
);
}
let
ret_data
=
{};
for
(
let
key
in
ret
)
{
ret_data
[
key
]
=
ret
[
key
][
0
];
}
ctx
.
logger
.
info
(
JSON
.
stringify
({
query_wexinpay_param
:
params
,
query_wexinpay_result
:
ret_data
}));
let
error_msg
=
'wexin orderquery error2'
;
if
(
ret_data
.
return_code
!==
'SUCCESS'
&&
ret_data
.
result_code
!==
'SUCCESS'
)
{
error_msg
=
ret_data
.
return_msg
?
ret_data
.
return_msg
:
error_msg
;
ctx
.
failed
(
error_msg
);
}
if
(
ret_data
.
trade_state
===
'SUCCESS'
)
{
return
false
;
}
...
...
@@ -237,8 +183,7 @@ class CommonService extends Service {
async
WexinNotify
(
result
)
{
const
{
ctx
}
=
this
;
// && result.appid === this.config.MCH_APPID
if
(
result
)
{
if
(
result
&&
result
.
appid
[
0
]
===
this
.
config
.
MCH_APPID
)
{
let
sign_data
=
{};
for
(
let
key
in
result
)
{
sign_data
[
key
]
=
result
[
key
][
0
];
...
...
@@ -246,7 +191,7 @@ class CommonService extends Service {
if
(
sign_data
.
return_code
&&
sign_data
.
return_code
===
'SUCCESS'
&&
sign_data
.
result_code
&&
sign_data
.
result_code
===
'SUCCESS'
)
{
const
wexin_return_sign
=
sign_data
.
sign
;
delete
sign_data
.
sign
;
const
sign
=
this
.
getSign
(
sign_data
);
const
sign
=
this
.
get
Wexin
Sign
(
sign_data
);
const
out_trade_no
=
sign_data
.
out_trade_no
;
const
total_fee
=
sign_data
.
total_fee
;
const
pay_info
=
await
ctx
.
prometheusModel
.
CreditPay
.
findOne
({
where
:
{
trade_no
:
out_trade_no
},
order
:
[[
'id'
,
'desc'
]]
});
...
...
@@ -257,13 +202,14 @@ class CommonService extends Service {
if
(
!
order
||
!
order
.
id
)
{
ctx
.
failed
(
'error order'
);
}
if
(
order
&&
order
.
pay_status
===
1
)
{
return
true
;
}
const
price
=
order
.
price
*
100
-
order
.
preferential_price
*
100
;
if
(
total_fee
==
price
&&
sign
==
wexin_return_sign
)
{
if
(
total_fee
==
price
&&
wexin_return_sign
===
sign
)
{
const
state_time
=
moment
().
format
(
'YYYY-MM-DD HH:mm:ss'
);
await
ctx
.
prometheusModel
.
CreditPay
.
edit
({
where
:
{
id
:
pay_info
.
id
},
params
:
{
pay_result
:
JSON
.
stringify
(
result
),
status
:
1
}
});
await
ctx
.
prometheusModel
.
CreditPay
.
edit
({
where
:
{
id
:
pay_info
.
id
},
params
:
{
pay_result
:
JSON
.
stringify
(
result
),
transaction_id
:
sign_data
.
transaction_id
,
status
:
1
}
});
await
ctx
.
prometheusModel
.
CreditOrder
.
update
({
state
:
'已支付'
,
state_time
:
state_time
,
pay_status
:
1
},
{
where
:
{
id
:
order
.
id
}
});
console
.
info
(
'7777777777777777777777'
);
return
true
;
}
}
...
...
@@ -288,8 +234,9 @@ class CommonService extends Service {
for
(
let
key
in
ret
)
{
str
+=
key
+
'='
+
ret
[
key
]
+
'&'
;
}
const
mch_key
=
this
.
config
.
MCH_KEY
;
const
mch_key
=
app
.
config
.
MCH_KEY
;
// console.info(str + 'key=' + mch_key);
const
sign
=
ctx
.
helper
.
md5
(
str
+
'key='
+
mch_key
).
toLocaleUpperCase
();
return
sign
;
...
...
app/service/credit/order.js
View file @
3eea291f
...
...
@@ -137,7 +137,22 @@ class OrderService extends Service {
if
(
order
&&
order
.
pay_status
===
1
)
{
return
true
;
}
if
(
!
order
||
!
order
.
id
)
{
ctx
.
failed
(
'error order'
);
}
if
(
order
&&
order
.
pay_status
===
1
)
{
return
true
;
}
const
credit_pay
=
await
ctx
.
prometheusModel
.
CreditPay
.
one
({
where
:
{
order_id
},
order
:
[[
'id'
,
'desc'
]]
});
if
(
!
credit_pay
||
!
credit_pay
.
id
)
{
ctx
.
failed
(
'error credit pay'
);
}
const
{
transaction_id
,
trade_no
}
=
credit_pay
;
const
wexin_check_pay_ret
=
await
ctx
.
service
.
credit
.
common
.
WexinCheckPay
({
transaction_id
,
trade_no
});
if
(
wexin_check_pay_ret
)
{
return
true
;
}
return
false
;
}
/**
...
...
@@ -180,6 +195,75 @@ class OrderService extends Service {
}
}
}
}
async
unifiedOrder
(
type
,
order_id
)
{
const
{
ctx
}
=
this
;
const
order
=
await
ctx
.
service
.
credit
.
order
.
getOrderInfo
(
order_id
);
if
(
order
&&
order
.
pay_status
===
1
)
{
ctx
.
failed
(
'订单已支付无需重复支付'
);
}
const
price
=
order
.
price
*
100
-
order
.
preferential_price
*
100
;
if
(
price
<=
0
)
{
ctx
.
failed
(
'error price'
);
}
if
(
type
===
'wexin'
)
{
let
body
=
'黑名单报告检测支付'
;
if
(
order
.
type
===
2
)
{
body
=
'个人通话风险检测支付'
;
}
const
data
=
{
body
,
order_id
,
trade_no
:
moment
().
valueOf
()
+
ctx
.
helper
.
PrefixInteger
(
order_id
,
11
),
total_fee
:
price
,
notify_url
:
'https://dev-nginx.jianbing.com/51business/api/credit/order/pay_notice'
,
product_id
:
order
.
order_no
,
scene_info
:
JSON
.
stringify
({
h5_info
:
{
type
:
'Wap'
,
wap_url
:
this
.
config
.
PHP_URL
,
wap_name
:
'我的信用'
},
}),
};
const
ret
=
await
ctx
.
service
.
credit
.
common
.
WexinUnifiedOrder
(
data
);
const
pay_data
=
{
order_id
,
trade_no
:
data
.
trade_no
,
description
:
data
.
body
,
prepay_id
:
ret
.
prepay_id
||
0
,
amount
:
data
.
total_fee
,
unifiedorder_result
:
JSON
.
stringify
(
ret
),
client_ip
:
ctx
.
helper
.
getClientIP
(),
};
await
this
.
addCreditPay
(
pay_data
);
return
{
url
:
ret
.
mweb_url
,
order_id
:
order_id
,
trade_no
:
data
.
trade_no
};
}
else
if
(
type
===
'alipay'
)
{
//TODO
}
return
false
;
}
async
addCreditPay
(
params
)
{
const
{
ctx
}
=
this
;
const
{
order_id
,
trade_no
,
prepay_id
,
amount
,
description
,
unifiedorder_result
,
client_ip
}
=
params
;
const
data
=
{
order_id
,
trade_no
,
prepay_id
,
amount
,
description
,
unifiedorder_result
,
client_ip
,
}
const
ret
=
await
ctx
.
prometheusModel
.
CreditPay
.
add
(
data
);
return
ret
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment