>백엔드 개발 >PHP 튜토리얼 >PHP는 WeChat에서 빨간 봉투를 보내고 빨간 봉투를 받는 효과를 모방합니다.

PHP는 WeChat에서 빨간 봉투를 보내고 빨간 봉투를 받는 효과를 모방합니다.

墨辰丷
墨辰丷원래의
2018-05-31 09:44:203025검색

최근 프로젝트 개발에는 WeChat을 모방한 빨간 봉투 기능 구현이 필요하지만(메시지 제외) 잔액만 빨간 봉투를 보내는 데 사용할 수 있습니다. 아래 편집자는 WeChat을 모방한 PHP를 사용하여 빨간 봉투를 보내고 받는 효과를 공유합니다. 관심 있는 친구들은 함께 살펴보세요

최근 프로젝트에 채팅 기반의 빨간 봉투 기능을 추가해야 합니다. WeChat을 모방(메시지 제외)하지만 잔액을 사용하여 빨간 봉투를 보낼 수 있습니다. 그래서 표시 정보, 분류(개인, 그룹 보통, 그룹 행운), 개수 제한(100), 금액 제한(200), 만료 시간(24시간) 등 다양한 대화형 인터페이스와 비즈니스 요구 사항을 이해하기 위해 WeChat 빨간 봉투를 여러 번 사용했습니다. ) ) 등을 거쳐 개발을 시작합니다. 아래에 언급된 인터페이스는 기본적으로 모두 앱 측에 제공됩니다.

1. 디자인 데이터 시트는 다음과 같습니다

CREATE TABLE `red_packet` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '用户id',
`for_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '发放对象(用户或群id)',
`pay_status` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '支付状态:0未支付,1已支付',
`type` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '类型:1、个人,2、群普通,3、群拼手气',
`intro` varchar(255) NOT NULL DEFAULT '' COMMENT '简介',
`number` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '个数',
`total_money` decimal(10,2) unsigned NOT NULL DEFAULT '0.0' COMMENT '总金额',
`single_money` decimal(10,2) unsigned NOT NULL DEFAULT '0.0' COMMENT '单个红包金额(群拼手气时为0)',
`return_money` decimal(10,2) unsigned NOT NULL DEFAULT '0.0' COMMENT '退还金额',
`is_cli_handle` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否经过cli退款处理:0否,1是',
`expend_time` mediumint(1) unsigned NOT NULL DEFAULT '0' COMMENT '领取消耗时间',
`add_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
`pay_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '支付时间',
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `pay_status` (`pay_status`),
KEY `pay_time` (`pay_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='红包发放表';
CREATE TABLE `red_packet_log` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`rp_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '红包id',
`user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '领取人id',
`money` decimal(10,2) unsigned NOT NULL DEFAULT '0.0' COMMENT '领取金额',
`is_good` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否手气最佳:0否,1是',
`add_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '添加时间',
`update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '领取时间',
PRIMARY KEY (`id`),
KEY `rp_id` (`rp_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='红包领取日志表';

2. 빨간 봉투 보내기

빨간 봉투는 채팅 인터페이스가 즉시 나오므로 왼쪽 그림에서 "빨간 봉투에 돈 넣기" 시 red_packet 테이블에 빨간 봉투 정보를 삽입하고(결제 상태는 미결제) 금액을 할당하고 행운을 계산한 다음 삽입합니다. red_packet_log 테이블에 입력합니다. (받는 사람과 수집 시간은 비어 있습니다.) 오른쪽 그림은 "결제 확인"입니다. "성공 후 red_packet 테이블의 결제 상태를 업데이트한 후 빨간 봉투를 보냅니다.

3. 빨간 봉투 받기(단체 빨간 봉투에 대해서만 분석됨)

빨간 봉투 받기에 대한 다양한 전제 조건을 스스로 결정하십시오. 그룹 빨간 봉투 집기에서(그룹의 수십 명이 빨간 봉투 몇 개를 집습니다) 이를 해결하기 위해 MQ를 소개합니다. 빨간 봉투를 보낼 때에는 우선 MQ에 빨간 봉투의 개수를 순서대로 적어주세요. 예를 들어, 빨간 봉투 3개를 보낸다면 1, 2, 3을 순서대로 적어주세요. 빨간 봉투를 잡을 때, 획득한 숫자는 당신이 잡은 빨간 봉투를 나타내며, 다음 단계는 red_packet_log 테이블의 수신자와 수집 시간을 업데이트하는 것입니다. 잔액에 돈을 추가하고 매출 기록과 같은 업무를 처리한 다음 결과를 수집하기 위해 돌아옵니다. 이는 물론 빨간 봉투가 잡히지 않았음을 의미하며 "나는 느립니다." 인터페이스가 직접 나타납니다. 초기 단계에서는 red_packet_log 테이블의 기본 키를 MQ에 기록하는 것을 고려했습니다. 그러면 로그 레코드를 정렬하고 검색할 필요가 없습니다. 그러나 이로 인해 MQ를 사용하여 "수신 소비 시간" 필드를 업데이트하는 것이 더 어려워졌습니다. 매장 번호를 입력하면 마지막 빨간 봉투인지(획득한 번호, 빨간 봉투 개수 등)를 직접 비교하여 경과 시간이 업데이트됩니다.

WeChat 빨간 봉투 수신 결과 페이지에는 다양한 유형이 있습니다(예: 행운 페이지 보기): 개인과 그룹 결과가 다르며, 빨간 봉투를 보내는 사람과 빨간 봉투를 받는 사람이 다른 결과를 볼 수 있으며, 그 이후의 메시지도 다릅니다. 개인과 그룹의 빨간 봉투 만료 기간이 다릅니다. 잠깐, 여기서는 하나씩 나열하지 않겠습니다. 기본적으로 인터페이스를 기반으로 데이터베이스를 확인하는 것뿐입니다.

4. 요구 사항 변경, 제3자 결제 추가

제3자 결제의 경우 동기식 및 비동기식 콜백과 콜백 시간 차이를 언급해야 합니다. 앱측 동기화 콜백이 성공하면 빨간 봉투가 발송됩니다. (앱측 결제 동기화 콜백이 콜백을 직접 호출합니다.) 이때 비동기 콜백이 1~2초 정도 지연되면 사용자는 지불 상태를 0 빨간 봉투로 가져옵니다. 앱이 긴 연결 인터페이스를 호출하여 비동기 콜백이 성공했는지 확인한 다음 빨간색 봉투를 보내는 경우 사용자 경험이 저하됩니다.

# 引入中间状态
ALTER TABLE `red_packet`
MODIFY COLUMN `pay_status` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '支付状态:0未支付,1已支付,2等待到账' AFTER `for_id`,
ADD COLUMN `pay_type` tinyint(1) NOT NULL DEFAULT 0 COMMENT '支付方式:0未知,1支付宝,2微信,3银联' AFTER `pay_status`,
ADD COLUMN `trade_no` varchar(30) NOT NULL DEFAULT '' COMMENT '第三方支付交易号' AFTER `pay_type`;
ALTER TABLE `red_packet_log`
ADD COLUMN `is_into_account` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否到账:0否,1是' AFTER `is_good`;

사용자가 빨간 봉투를 가져오면 is_into_account의 값이 pay_status에 따라 결정됩니다.

동기적으로 앱으로 다시 호출하면 호출 인터페이스에서 결제 상태 pay_status를 2로 변경합니다. 비동기적으로 서버로 돌아간 다음 결제 상태 pay_status를 1로 변경하고 is_into_account=1의 red_packet_log 레코드를 찾아 처리합니다.

그러나 위의 세 단계는 red_packet 쿼리에 대해 FOR UPDATE 작업을 수행해야 합니다. 그렇지 않으면 실행 시간 및 순서 문제가 발생하여 일부 red_packet_log 레코드가 is_into_account=0에 도착하지 않게 되고 잠금 메커니즘으로 인해 사용자도 다음과 같이 됩니다. 빨간 봉투를 잡을 때 헷갈립니다. 잠금이 해제될 때까지 기다려야 하기 때문에 매우 느립니다.


개선 사항은 다음과 같습니다. (전체 프로세스에서 FOR UPDATE가 없음)

사용자가 빨간색 봉투를 가져오면 is_into_account의 값이 pay_status에 따라 결정됩니다. app에서는 결제 상태 pay_status를 2로 변경하기 위해 인터페이스가 호출됩니다.

서버에 비동기 콜백이 이루어지면 결제 상태 pay_status가 1로 변경되고 빨간색 봉투 ID(red_packet 기본 키)가 MQ에 입력됩니다.

백그라운드 자동 스크립트는 MQ에서 빨간 봉투 ID를 가져온 후 빨간 봉투 is_into_account=0을 넣습니다. 레코드가 처리된 다음 빨간 봉투 ID가 5초 지연 후 다시 MQ에 기록되고 2차 처리가 이루어집니다. 모든 데이터가 수신되었는지 확인하기 위해 수행됩니다.

5. 만료된 빨간 봉투 반환

다음은 red_packet 테이블의 pay_time을 기반으로 24시간을 초과했는지, 돈이 회수되지 않았는지 확인하고 사용자의 잔액을 반환하는 자동 스크립트입니다.

위 내용은 이 글의 전체 내용입니다. 모든 분들의 공부에 도움이 되었으면 좋겠습니다.


관련 추천 :

PHP 반검색 알고리즘 사례에 대한 자세한 설명

php클래스 자동 로딩, 체인 연산, 매직 메소드 구현 코드_phpTips

PHP 순서 아주 상세한 테이블 조회 보간 조회 알고리즘 단계 설명

위 내용은 PHP는 WeChat에서 빨간 봉투를 보내고 빨간 봉투를 받는 효과를 모방합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.