WeChat QRコードでのお支払い
一、マイクロサービスの作成
1、導入依存
Http Client:http/https関連操作
1、ブラウザ入力要求アドレス:http://localhost:18090/weixin/pay/create/native?outtradeno=198999&totalfee=101
2、パラメータ解釈:
outtradeno:注文番号
totalfee:総金額
3、ブラウザ要求結果
1、Qrious.jsを使ってページpayを書いて、二次元コードを生成するために使います.
四、支払い状態を照会する
1、制御層添加方法(controler)
パラメータ説明:outtradeno:注文番号
五、支払結果のフィードバック
1、制御層添加方法
ブラウザ入力要求:http://19453k43d4.51vip.biz:32375/weixin/pay//create/native?outtradeno=1999&totalfee=1
ブラウザ入力要求アドレス:http://19453k43d4.51vip.biz:32375/weixin/pay/status/query?outtradeno=1999
六、MQメッセージ中間部品監聴
WeChatサービスから返された支払い状態は、MQメッセージのミドルウェアに送信される.
1、支払システムに依存を導入する
3、キューバインディングスイッチの構成を作成する
1、注文システムに依存を導入する
a.ブラウザ要求アドレス:http://19453k43d4.51vip.biz:32375/weixin/pay/create/native?outtradeno=1769&totalfee=1
七、注文状況を修正する
1、注文工程で修正する
アプリケーション層インターフェースにインターフェースを追加します.
MQ情報モニターの設定を変更します.Order Message Listener
受注アプリケーションを注入する操作対象
二次元コード情報を作成し、ブラウザ入力要求:http://localhost:18090/weixin/pay/create/native?outtradeno=1355321180126445568&totalfee=1
スキャンコードの支払いに成功した後、情報が傍受されました.
データベース内の注文表も、傍受されたメッセージに基づいて変更されました. .
1、導入依存
com.github.wxpay
wxpay-sdk
0.0.3
org.apache.httpcomponents
httpclient
2、必要な工具類Http Client:http/https関連操作
public class HttpClient {
private String url;
private Map<String, String> param;
private int statusCode;
private String content;
private String xmlParam;
private boolean isHttps;
public boolean isHttps() {
return isHttps;
}
public void setHttps(boolean isHttps) {
this.isHttps = isHttps;
}
public String getXmlParam() {
return xmlParam;
}
public void setXmlParam(String xmlParam) {
this.xmlParam = xmlParam;
}
public HttpClient(String url, Map<String, String> param) {
this.url = url;
this.param = param;
}
public HttpClient(String url) {
this.url = url;
}
public void setParameter(Map<String, String> map) {
param = map;
}
public void addParameter(String key, String value) {
if (param == null)
param = new HashMap<String, String>();
param.put(key, value);
}
public void post() throws ClientProtocolException, IOException {
HttpPost http = new HttpPost(url);
setEntity(http);
execute(http);
}
public void put() throws ClientProtocolException, IOException {
HttpPut http = new HttpPut(url);
setEntity(http);
execute(http);
}
public void get() throws ClientProtocolException, IOException {
if (param != null) {
StringBuilder url = new StringBuilder(this.url);
boolean isFirst = true;
for (String key : param.keySet()) {
if (isFirst) {
url.append("?");
}else {
url.append("&");
}
url.append(key).append("=").append(param.get(key));
}
this.url = url.toString();
}
HttpGet http = new HttpGet(url);
execute(http);
}
/**
* set http post,put param
*/
private void setEntity(HttpEntityEnclosingRequestBase http) {
if (param != null) {
List<NameValuePair> nvps = new LinkedList<NameValuePair>();
for (String key : param.keySet()) {
nvps.add(new BasicNameValuePair(key, param.get(key))); //
}
http.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8)); //
}
if (xmlParam != null) {
http.setEntity(new StringEntity(xmlParam, Consts.UTF_8));
}
}
private void execute(HttpUriRequest http) throws ClientProtocolException,
IOException {
CloseableHttpClient httpClient = null;
try {
if (isHttps) {
SSLContext sslContext = new SSLContextBuilder()
.loadTrustMaterial(null, new TrustStrategy() {
//
@Override
public boolean isTrusted(X509Certificate[] chain,
String authType)
throws CertificateException {
return true;
}
}).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
sslContext);
httpClient = HttpClients.custom().setSSLSocketFactory(sslsf)
.build();
} else {
httpClient = HttpClients.createDefault();
}
CloseableHttpResponse response = httpClient.execute(http);
try {
if (response != null) {
if (response.getStatusLine() != null) {
statusCode = response.getStatusLine().getStatusCode();
}
HttpEntity entity = response.getEntity();
//
content = EntityUtils.toString(entity, Consts.UTF_8);
}
} finally {
response.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
httpClient.close();
}
}
public int getStatusCode() {
return statusCode;
}
public String getContent() throws ParseException, IOException {
return content;
}
}
3、プロファイル:appication.ymlserver:
port: 18090
spring:
application:
name: pay
main:
allow-bean-definition-overriding: true
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:7001/eureka
instance:
prefer-ip-address: true
feign:
hystrix:
enabled: true
#hystrix
hystrix:
command:
default:
execution:
timeout:
# enabled false, ribbon
enabled: true
isolation:
strategy: SEMAPHORE
#
weixin:
# ID
appid: wx8397f8696b538317
#
partner: 1473426802
#
partnerkey: T6m9iK73b0kn9g5v426MKfHQH7X8rKwb
#
notifyurl: https://www.cnblogs.com/chawaner/
4、SprigBoot起動類/**
* @Author TeaBowl
* @Date 2021/2/1 10:47
* @Version 1.0
*/
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class})
@EnableEurekaClient
public class WeiXinPayApplication {
public static void main(String[] args) {
SpringApplication.run(WeiXinPayApplication.class,args);
}
}
5、制御層/**
* @Author TeaBowl
* @Date 2021/2/1 12:01
* @Version 1.0
*/
@RestController
@RequestMapping(value = "/weixin/pay")
public class WeiXinPayController {
@Autowired
private WeixinPayService weixinPayService;
/**
*
* @param parameterMap:
* @return
*/
@RequestMapping(value = "/create/native")
public Result createNative(@RequestParam Map<String,String> parameterMap){
Map<String,String> resultMap = weixinPayService.createnative(parameterMap);
return new Result(true, StatusCode.OK," !",resultMap);
}
}
6、アプリケーション層/**
* @Author TeaBowl
* @Date 2021/2/1 11:01
* @Version 1.0
*/
public interface WeixinPayService {
/**
*
* @param parameterMap:
* @return
*/
Map createnative(Map<String,String> parameterMap);
}
/**
* @Author TeaBowl
* @Date 2021/2/1 11:00
* @Version 1.0
*/
@Service
public class WeixinPayServiceImpl implements WeixinPayService {
// ID
@Value("${weixin.appid}")
private String appid;
//
@Value("${weixin.partner}")
private String partner;
//
@Value("${weixin.partnerkey}")
private String partnerkey;
//
@Value("${weixin.notifyurl}")
private String notifyurl;
/**
*
*
* @param parameterMap:
* @return
*/
@Override
public Map createnative(Map<String, String> parameterMap) {
try {
//
// Map
Map<String, String> paramMap = new HashMap<>();
//
// ID
paramMap.put("appid", appid);
//
paramMap.put("mch_id", partner);
//
paramMap.put("nonce_str", WXPayUtil.generateNonceStr());
//
paramMap.put("body", " ");
//
paramMap.put("out_trade_no", parameterMap.get("outtradeno"));
// , :
paramMap.put("total_fee", parameterMap.get("totalfee"));
// IP
paramMap.put("spbill_create_ip", "127.0.0.1");
// , URL
paramMap.put("notify_url", notifyurl);
// ,NATIVE
paramMap.put("trade_type", "NATIVE");
//
//paramMap.put("sign","");
//Map XML ,
// , XML
String xmlStr = WXPayUtil.generateSignedXml(paramMap, partnerkey);
//URL ,
String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
// :HTTPS
// HttpClient , url
HttpClient httpClient = new HttpClient(url);
// HTTPS
httpClient.setHttps(true);
// , XML
httpClient.setXmlParam(xmlStr);
//
// XML , post
httpClient.post();
// , XML
String content = httpClient.getContent();
System.out.println("content:" + content);
// Map
Map<String, String> resultMap = WXPayUtil.xmlToMap(content);
return resultMap;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
二、テスト1、ブラウザ入力要求アドレス:http://localhost:18090/weixin/pay/create/native?outtradeno=198999&totalfee=101
2、パラメータ解釈:
outtradeno:注文番号
totalfee:総金額
3、ブラウザ要求結果
{
"flag": true,
"code": 20000,
"message": " !",
"data": {
"nonce_str": "pUPI4MeBq1ikJbOJ",
"code_url": "weixin://wxpay/bizpayurl?pr=qJVBnYYzz",
"appid": "wx8397f8696b538317",
"sign": "7BCED5501AD892D5490A109DADE3383F",
"trade_type": "NATIVE",
"return_msg": "OK",
"result_code": "SUCCESS",
"mch_id": "1473426802",
"return_code": "SUCCESS",
"prepay_id": "wx011403161517455f3f2880f7e02e920000"
}
}
三、二次元コードを生成する1、Qrious.jsを使ってページpayを書いて、二次元コードを生成するために使います.
<html>
<head>
<title> demotitle>
<script src="qrious.js"> script>
head>
<body>
<img id="myqrious" >
body>
<script>
var qrious = new QRious({
element:document.getElementById("myqrious"),// DOM
size:250,//
level:'H',// (H: 30% )
value:'weixin://wxpay/bizpayurl?pr=qJVBnYYzz'//
})
script>
html>
2、pay.を開けて、2次元コードを表示し、ウィーチャット・スキャンコードでを支払う.四、支払い状態を照会する
1、制御層添加方法(controler)
/**
*
* @param outtradeno: ,
* @return
*/
@GetMapping(value = "/status/query")
public Result queryStatus(String outtradeno){
//
Map map = weixinPayService.queryStatus(outtradeno);
return new Result(true, StatusCode.OK," !",map);
}
2、アプリケーション層添加方法(service、serviceImpl)/**
*
* @param outtradeno: ,
* @return
*/
Map queryStatus(String outtradeno);
/**
*
* @param outtradeno: ,
* @return
*/
@Override
public Map queryStatus(String outtradeno) {
try {
//
// Map
Map<String, String> paramMap = new HashMap<>();
//
// ID
paramMap.put("appid", appid);
//
paramMap.put("mch_id", partner);
//
paramMap.put("nonce_str", WXPayUtil.generateNonceStr());
//
paramMap.put("out_trade_no", outtradeno);
//
//paramMap.put("sign","");
//Map XML ,
// , XML
String xmlStr = WXPayUtil.generateSignedXml(paramMap, partnerkey);
//URL ,
String url = "https://api.mch.weixin.qq.com/pay/orderquery";
// :HTTPS
// HttpClient , url
HttpClient httpClient = new HttpClient(url);
// HTTPS
httpClient.setHttps(true);
// , XML
httpClient.setXmlParam(xmlStr);
//
// XML , post
httpClient.post();
// , XML
String content = httpClient.getContent();
//System.out.println("content:" + content);
// Map
Map<String, String> resultMap = WXPayUtil.xmlToMap(content);
return resultMap;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
3、ブラウザ入力要求アドレス:http://localhost:18090/weixin/pay/status/query?outtradeno=198999 パラメータ説明:outtradeno:注文番号
{
"flag": true,
"code": 20000,
"message": " !",
"data": {
"nonce_str": "9FMEOJb0nhdJzGOQ",
"device_info": "",
"out_trade_no": "198999",
"trade_state": "NOTPAY",
"appid": "wx8397f8696b538317",
"total_fee": "101",
"sign": "1C86209F252D64254542EFC5481FD0D0",
"trade_state_desc": " ",
"return_msg": "OK",
"result_code": "SUCCESS",
"mch_id": "1473426802",
"return_code": "SUCCESS"
}
}
上のテストで二次元コードを支払う時、私は支払わなかったので、注文書の支払い状態を調べて「注文書はまだ支払われていません」と表示します.五、支払結果のフィードバック
1、制御層添加方法
/**
*
* @param request
* @return
*/
@RequestMapping(value = "/notify/url")
public String notifyurl(HttpServletRequest request) throws Exception {
// ,
ServletInputStream inputStream = request.getInputStream();
// OutputStream ->
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
//
byte[] buffer = new byte[1024];
//
int len = 0;
// , -1
while ((len = inputStream.read(buffer))!=-1){
//
// 0
byteArrayOutputStream.write(buffer,0,len);
}
// byteArrayOutputStream
//
byte[] byteArray = byteArrayOutputStream.toByteArray();
// xml
String xmlResult = new String(byteArray, "Utf-8");
System.out.println("xmlResult:
"+xmlResult);
//xml Map
Map<String, String> resultMap = WXPayUtil.xmlToMap(xmlResult);
System.out.println("resultMap:
"+resultMap);
//
String result = " ";
return result;
}
2、設定ファイルでのコールバックアドレスの変更は動的呼び出しとなります.#
weixin:
# ID
appid: wx8397f8696b538317
#
partner: 1473426802
#
partnerkey: T6m9iK73b0kn9g5v426MKfHQH7X8rKwb
#
# :http://19453k43d4.51vip.biz:32375
notifyurl: http://19453k43d4.51vip.biz:32375/weixin/pay/notify/url
3、二次元コードを作成するブラウザ入力要求:http://19453k43d4.51vip.biz:32375/weixin/pay//create/native?outtradeno=1999&totalfee=1
{
"flag": true,
"code": 20000,
"message": " !",
"data": {
"nonce_str": "pUPI4MeBq1ikJbOJ",
"code_url": "weixin://wxpay/bizpayurl?pr=qJVBnYYzd",
"appid": "wx8397f8696b538317",
"sign": "7BCED5501AD892D5490A109DADE3383F",
"trade_type": "NATIVE",
"return_msg": "OK",
"result_code": "SUCCESS",
"mch_id": "1473426802",
"return_code": "SUCCESS",
"prepay_id": "wx011403161517455f3f2880f7e02e920000"
}
}
4、pay.のvalueを修正するのは上のcode_です.url<html>
<head>
<title> demotitle>
<script src="qrious.js"> script>
head>
<body>
<img id="myqrious" >
body>
<script>
var qrious = new QRious({
element:document.getElementById("myqrious"),// DOM
size:250,//
level:'H',// (H: 30% )
value:'weixin://wxpay/bizpayurl?pr=qJVBnYYzd'//
})
script>
html>
5、pay.をダブルクリックして開けて、二次元コードを生成して、コードをスキャンして支払った後.ブラウザ入力要求アドレス:http://19453k43d4.51vip.biz:32375/weixin/pay/status/query?outtradeno=1999
{
"flag": true,
"code": 20000,
"message": " !",
"data": {
"transaction_id": "4200000517202002187004756359",
"nonce_str": "ZxVmHMCc1mVr8rxR",
"trade_state": "SUCCESS",
"bank_type": "OTHERS",
"openid": "oNpSGwaqHv74waDX0BLPNrFiYIUo",
"sign": "3DC6A5346C914DE745DBBB7796039BC1",
"return_msg": "OK",
"fee_type": "CNY",
"mch_id": "1473426802",
"cash_fee": "1",
"out_trade_no": "1999",
"cash_fee_type": "CNY",
"appid": "wx8397f8696b538317",
"total_fee": "1",
"trade_state_desc": " ",
"trade_type": "NATIVE",
"result_code": "SUCCESS",
"attach": "",
"time_end": "20200218153715",
"is_subscribe": "N",
"return_code": "SUCCESS"
}
}
6、コンソール出力を確認し、支払い結果通知があります.六、MQメッセージ中間部品監聴
WeChatサービスから返された支払い状態は、MQメッセージのミドルウェアに送信される.
1、支払システムに依存を導入する
org.springframework.boot
spring-boot-starter-amqp
2、プロファイルappration.ymlに情報を追加する rabbitmq:
host:
port:
username:
password:
#
mq:
pay:
exchange:
order: exchange.order
queue:
order: queue.order
routing:
key: queue.order
実際の開発では、「サーバアドレス:1572」を登録して、手動でスイッチとキューを作成します.3、キューバインディングスイッチの構成を作成する
/**
* @Author TeaBowl
* @Date 2021/2/3 11:26
* @Version 1.0
*/
@Configuration
public class MQConfig {
/**
*
*/
@Autowired
private Environment env;
/**
*
* @return
*/
@Bean
public Queue OrderQueue (){
// :
return new Queue(env.getProperty("mq.pay.queue.order"));
}
/**
*
* @return
*/
@Bean
public Exchange OrderExchange (){
// : 、 、
return new DirectExchange(env.getProperty("mq.pay.exchange.order"),true,false);
}
/**
*
* @param orderQueue:
* @param orderExchange:
* @return
*/
@Bean
public Binding orderQueueExchange(Queue orderQueue,Exchange orderExchange){
//
return BindingBuilder.bind(orderQueue).to(orderExchange).with(env.getProperty("mq.pay.routing.key")).noargs();
}
}
4、controllerにMQ操作対象を注入する// MQ
@Autowired
private RabbitTemplate rabbitTemplate;
5、controlllerにおける支払結果通知のフィードバック方法を修正する./**
*
* @param request
* @return
*/
@RequestMapping(value = "/notify/url")
public String notifyurl(HttpServletRequest request) throws Exception {
// ,
ServletInputStream inputStream = request.getInputStream();
// OutputStream ->
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
//
byte[] buffer = new byte[1024];
//
int len = 0;
// , -1
while ((len = inputStream.read(buffer))!=-1){
//
// 0
byteArrayOutputStream.write(buffer,0,len);
}
// byteArrayOutputStream
//
byte[] byteArray = byteArrayOutputStream.toByteArray();
// xml
String xmlResult = new String(byteArray, "Utf-8");
System.out.println("xmlResult:
"+xmlResult);
//xml Map
Map<String, String> resultMap = WXPayUtil.xmlToMap(xmlResult);
System.out.println("resultMap:
"+resultMap);
// MQ
rabbitTemplate.convertAndSend("exchange.order","queue.order", JSON.toJSONString(resultMap));
//
String result = " ";
return result;
}
注文システムはMQメッセージを傍受します.1、注文システムに依存を導入する
org.springframework.boot
spring-boot-starter-amqp
2、プロファイルappration.ymlに情報を追加する rabbitmq:
host:
port:
username:
password:
#
mq:
pay:
#
exchange:
order: exchange.order
#
queue:
order: queue.order
routing:
key: queue.order
3、モニターMQ情報の設定を作成する/**
* @Author TeaBowl
* @Date 2021/2/3 12:02
* @Version 1.0
* MQ
*/
@Component
@RabbitListener(queues = "${mq.pay.queue.order}") //
public class OrderMessageListener {
/**
*
* @param message:
*/
@RabbitHandler
public void getMeaaage(String message){
// ,Json Map
Map<String, String> resultMap = JSON.parseObject(message, Map.class);
System.out.println(" :
"+resultMap);
// MQ
// :return_code :SUCCESS/FAIL
String return_code = resultMap.get("return_code");
//
if (return_code.equals("SUCCESS")){
// MQ
// :result_code :SUCCESS/FAIL
String result_code = resultMap.get("result_code");
// :out_trade_no
String out_trade_no = resultMap.get("out_trade_no");
//
if (result_code.equals("SUCCESS")){
// MQ
// :transaction_id
String transaction_id = resultMap.get("transaction_id");
}else {
// , , ,
}
}
}
}
4、二次元コードの実を作成するa.ブラウザ要求アドレス:http://19453k43d4.51vip.biz:32375/weixin/pay/create/native?outtradeno=1769&totalfee=1
{
"flag": true,
"code": 20000,
"message": " !",
"data": {
"nonce_str": "QlLrzt4vdsKNck1d",
"code_url": "weixin://wxpay/bizpayurl?pr=MjNPE2Dzz",
"appid": "wx8397f8696b538317",
"sign": "CD80E7E68014CF70C36535E231E0FF14",
"trade_type": "NATIVE",
"return_msg": "OK",
"result_code": "SUCCESS",
"mch_id": "1473426802",
"return_code": "SUCCESS",
"prepay_id": "wx03125509016851a5fca270399354320000"
}
}
b.pay.の支払い先をcode_と修正する.urlアドレス<html>
<head>
<title> demotitle>
<script src="qrious.js"> script>
head>
<body>
<img id="myqrious" >
body>
<script>
var qrious = new QRious({
element:document.getElementById("myqrious"),// DOM
size:250,//
level:'H',// (H: 30% )
value:'weixin://wxpay/bizpayurl?pr=MjNPE2Dzz'//
})
script>
html>
c.二次元コードピクチャ、スイープコードの支払い後.ブラウザRabbiitMQのバックグラウンドを参照すると、「サーバアドレス:1572/〹/queues」参照メッセージ: 七、注文状況を修正する
1、注文工程で修正する
アプリケーション層インターフェースにインターフェースを追加します.
/**
*
* @param outtradeno:
* @param paytime:
* @param transactionid:
*/
void updataStatus(String outtradeno,String paytime,String transactionid) throws Exception;
アプリケーション層インターフェース実装クラス(Order ServiceImpl)では、追加方法が実現されます./**
*
* @param outtradeno:
* @param paytime:
* @param transactionid:
*/
@Override
public void updataStatus(String outtradeno, String paytime, String transactionid) throws Exception {
// ,
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
Date payTimeInfo = simpleDateFormat.parse(paytime);
// , order
Order order = orderMapper.selectByPrimaryKey(outtradeno);
//
//
order.setPayTime(payTimeInfo);
// :0 ,1 ,2
order.setPayStatus("1");
//
order.setTransactionId(transactionid);
//
orderMapper.updateByPrimaryKeySelective(order);
}
2、注文書を削除し、在庫を戻します. , , , ;
, , , 。
アプリケーション層インターフェースにインターフェースを追加します./**
* , [ ] ,
* @param outtradeno:
*/
void deleteOrder(String outtradeno);
アプリケーション層インターフェース実装クラス(Order ServiceImpl)では、追加方法が実現されます./**
* , [ ] ,
* @param outtradeno:
*/
@Override
public void deleteOrder(String outtradeno) {
// , order
Order order = orderMapper.selectByPrimaryKey(outtradeno);
//
//
order.setUpdateTime(new Date());
// :0 ,1 ,2
order.setPayStatus("2");
//
orderMapper.updateByPrimaryKeySelective(order);
// ->
}
3、ドッキング傍受MQ情報モニターの設定を変更します.Order Message Listener
受注アプリケーションを注入する操作対象
@Autowired
private OrderService orderService;
支払結果の傍受方法を修正する/**
*
* @param message:
*/
@RabbitHandler
public void getMeaaage(String message) throws Exception {
// ,Json Map
Map<String, String> resultMap = JSON.parseObject(message, Map.class);
System.out.println(" :
"+resultMap);
// MQ
// :return_code :SUCCESS/FAIL
String return_code = resultMap.get("return_code");
//
if (return_code.equals("SUCCESS")){
// MQ
// :result_code :SUCCESS/FAIL
String result_code = resultMap.get("result_code");
// :out_trade_no
String out_trade_no = resultMap.get("out_trade_no");
//
if (result_code.equals("SUCCESS")){
//
// : 、 、
orderService.updataStatus(out_trade_no,resultMap.get("time_end"),resultMap.get("transaction_id"));
}else {
// , , ,
//
// , [ ] ,
orderService.deleteOrder(out_trade_no);
}
}
}
4、テスト二次元コード情報を作成し、ブラウザ入力要求:http://localhost:18090/weixin/pay/create/native?outtradeno=1355321180126445568&totalfee=1
{
"flag": true,
"code": 20000,
"message": " !",
"data": {
"nonce_str": "Dc7zjYlcdvPxienu",
"code_url": "weixin://wxpay/bizpayurl?pr=s2V4HM3zz",
"appid": "wx8397f8696b538317",
"sign": "7D75E71E44AD669496C14684A66D8501",
"trade_type": "NATIVE",
"return_msg": "OK",
"result_code": "SUCCESS",
"mch_id": "1473426802",
"return_code": "SUCCESS",
"prepay_id": "wx04014823728571d0a1350cf856a41e0000"
}
}
pay.の支払い先を修正します.<html>
<head>
<title> demotitle>
<script src="qrious.js"> script>
head>
<body>
<img id="myqrious" >
body>
<script>
var qrious = new QRious({
element:document.getElementById("myqrious"),// DOM
size:250,//
level:'H',// (H: 30% )
value:'weixin://wxpay/bizpayurl?pr=s2V4HM3zz'//
})
script>
html>
pay.をダブルクリックして二次元コードを生成する.スキャンコードの支払いに成功した後、情報が傍受されました.
データベース内の注文表も、傍受されたメッセージに基づいて変更されました. .